scispace - formally typeset
Search or ask a question
Author

Andrew Hunt

Bio: Andrew Hunt is an academic researcher. The author has contributed to research in topics: Unit testing & Active record pattern. The author has an hindex of 15, co-authored 20 publications receiving 7181 citations.

Papers
More filters
01 Jan 2001
TL;DR: Here the authors haven’t even started the project yet, and already they’re forced to answer many questions: what will this thing be named, what directory will it be in, what type of module is it, how should it be compiled, and so on.
Abstract: Writers face the blank page, painters face the empty canvas, and programmers face the empty editor buffer. Perhaps it’s not literally empty—an IDE may want us to specify a few things first. Here we haven’t even started the project yet, and already we’re forced to answer many questions: what will this thing be named, what directory will it be in, what type of module is it, how should it be compiled, and so on.

6,547 citations

Book
01 Jan 1999
TL;DR: Straight from the programming trenches, The Pragmatic Programmer cuts through the increasing specialization and technicalities of modern software development to examine the core process--taking a requirement and producing working, maintainable code that delights its users.
Abstract: What others in the trenches say about The Pragmatic Programmer... The cool thing about this book is that its great for keeping the programming process fresh. The book helps you to continue to grow and clearly comes from people who have been there.  Kent Beck, author of Extreme Programming Explained: Embrace Change I found this book to be a great mix of solid advice and wonderful analogies!  Martin Fowler, author of Refactoring and UML Distilled I would buy a copy, read it twice, then tell all my colleagues to run out and grab a copy. This is a book I would never loan because I would worry about it being lost.  Kevin Ruland, Management Science, MSG-Logistics The wisdom and practical experience of the authors is obvious. The topics presented are relevant and useful.... By far its greatest strength for me has been the outstanding analogiestracer bullets, broken windows, and the fabulous helicopter-based explanation of the need for orthogonality, especially in a crisis situation. I have little doubt that this book will eventually become an excellent source of useful information for journeymen programmers and expert mentors alike.  John Lakos, author of Large-Scale C++ Software Design This is the sort of book I will buy a dozen copies of when it comes out so I can give it to my clients.  Eric Vought, Software Engineer Most modern books on software development fail to cover the basics of what makes a great software developer, instead spending their time on syntax or technology where in reality the greatest leverage possible for any software team is in having talented developers who really know their craft well. An excellent book.  Pete McBreen, Independent Consultant Since reading this book, I have implemented many of the practical suggestions and tips it contains. Across the board, they have saved my company time and money while helping me get my job done quicker! This should be a desktop reference for everyone who works with code for a living.  Jared Richardson, Senior Software Developer, iRenaissance, Inc. I would like to see this issued to every new employee at my company....  Chris Cleeland, Senior Software Engineer, Object Computing, Inc. If Im putting together a project, its the authors of this book that I want. . . . And failing that Id settle for people whove read their book.  Ward Cunningham Straight from the programming trenches, The Pragmatic Programmer cuts through the increasing specialization and technicalities of modern software development to examine the core process--taking a requirement and producing working, maintainable code that delights its users. It covers topics ranging from personal responsibility and career development to architectural techniques for keeping your code flexible and easy to adapt and reuse. Read this book, and you'll learn how to Fight software rot; Avoid the trap of duplicating knowledge; Write flexible, dynamic, and adaptable code; Avoid programming by coincidence; Bullet-proof your code with contracts, assertions, and exceptions; Capture real requirements; Test ruthlessly and effectively; Delight your users; Build teams of pragmatic programmers; and Make your developments more precise with automation. Written as a series of self-contained sections and filled with entertaining anecdotes, thoughtful examples, and interesting analogies, The Pragmatic Programmer illustrates the best practices and major pitfalls of many different aspects of software development. Whether you're a new coder, an experienced programmer, or a manager responsible for software projects, use these lessons daily, and you'll quickly see improvements in personal productivity, accuracy, and job satisfaction. You'll learn skills and develop habits and attitudes that form the foundation for long-term success in your career. You'll become a Pragmatic Programmer.

414 citations

Book
13 Oct 2000
TL;DR: Ruby is an Object-Oriented Language Some Basic Ruby Arrays and Hashes Control Structures Regular Expressions Blocks and Iterators Reading and 'Riting Onward and Upward and more.
Abstract: Contents FOREWORD TO THE FIRST EDITION FOREWORD TO THE SECOND EDITION PREFACE ROAD MAP PART I--FACETS OF RUBY 1 GETTING STARTED Installing Ruby Running Ruby Ruby Documentation: RDoc and ri 2 RUBY.NEW Ruby Is an Object-Oriented Language Some Basic Ruby Arrays and Hashes Control Structures Regular Expressions Blocks and Iterators Reading and 'Riting Onward and Upward 3 CLASSES, OBJECTS, AND VARIABLES Inheritance and Messages Objects and Attributes Class Variables and Class Methods Access Control Variables CONTAINERS, BLOCKS, AND ITERATORS Containers Blocks and Iterators Containers Everywhere 5 STANDARD TYPES Numbers Strings Ranges Regular Expressions 6 MORE ABOUT METHODS Defining a Method Calling a Method 7 EXPRESSIONS Operator Expressions Miscellaneous Expressions Assignment Conditional Execution Case Expressions Loops Variable Scope, Loops, and Blocks 8 EXCEPTIONS, CATCH, AND THROW The Exception Class Handling Exceptions Raising Exceptions Catch and Throw 9 MODULES Namespaces Mixins Iterators and the EnumerableModule Composing Modules Including Other Files 10 BASIC INPUT AND OUTPUT What Is an IO Object? Opening and Closing Files Reading and Writing Files Talking to Networks 11 THREADS AND PROCESSES Multithreading Controlling the Thread Scheduler Mutual Exclusion Running Multiple Processes 12 UNIT TESTING Test::Unit Framework Structuring Tests Organizing and Running Tests 13 WHEN TROUBLE STRIKES Ruby Debugger Interactive Ruby Editor Support But It Doesn'tWork! But It's Too Slow! PART II--RUBY IN ITS SETTING 14 RUBY AND ITS WORLD Command-Line Arguments Program Termination Environment Variables Where Ruby Finds Its Modules Build Environment 15 INTERACTIVE RUBY SHELL Command Line Configuration Commands Restrictions rtags and xmp 16 DOCUMENTING RUBY Adding RDoc to Ruby Code Adding RDoc to C Extensions Running RDoc Displaying Program Usage 17 PACKAGE MANAGEMENT WITH RUBYGEMS Installing RubyGems Installing Application Gems Installing and Using Gem Libraries Creating Your Own Gems 18 RUBY AND THE WEB Writing CGI Scripts Cookies Improving Performance Choice of Web Servers SOAP and Web Services More Information 19 RUBY TK Simple Tk Application Widgets Binding Events Canvas Scrolling Translating from Perl/Tk Documentation 20 RUBY AND MICROSOFT WINDOWS Getting Ruby for Windows Running Ruby Under Windows Win32API Windows Automation 21 EXTENDING RUBY Your First Extension Ruby Objects in C The Jukebox Extension Memory Allocation Ruby Type System Creating an Extension Embedding a Ruby Interpreter Bridging Ruby to Other Languages Ruby C Language API PART III--RUBY CRYSTALLIZED 22 THE RUBY LANGUAGE Source Layout The Basic Types Names Variables and Constants Predefined Variables Expressions Boolean Expressions if and unless Expressions case Expressions Loop Constructs Method Definition Invoking a Method Aliasing Class Definition Module Definitions Access Control Blocks, Closures, and Proc Objects Exceptions Catch and Throw 23 DUCK TYPING Classes Aren't Types Coding like a Duck Standard Protocols and Coercions Walk the Walk, Talk the Talk 24 CLASSES AND OBJECTS How Classes and Objects Interact Class and Module Definitions Top-Level Execution Environment Inheritance and Visibility Freezing Objects 25 LOCKING RUBY IN THE SAFE Safe Levels Tainted Objects 26 REFLECTION, OBJECTSPACE, AND DISTRIBUTED RUBY Looking at Objects Looking at Classes Calling Methods Dynamically System Hooks Tracing Your Program's Execution Marshaling and Distributed Ruby Compile Time? Runti

198 citations

Book
01 Sep 2003
TL;DR: The JUnit Starter Kit as mentioned in this paper is a collection of unit testing tools, including a framework for unit testing, a test suite, a set of helper classes, a helper class, and a test skeleton.
Abstract: About the Starter Kit Preface 1 Introduction 1.1 Coding With Confidence 1.2 What is Unit Testing? 1.3 Why Should I Bother with Unit Testing? 1.4 What Do I Want to Accomplish? 1.5 How Do I Do Unit Testing? 1.6 Excuses For Not Testing 1.7 Roadmap 2 Your First Unit Tests 2.1 Planning Tests 2.2 Testing a Simple Method. 2.3 More Tests 3 Writing Tests in JUnit 3.1 Structuring Unit Tests 3.2 JUnit Asserts 3.3 JUnit Framework 3.4 JUnit Test Composition 3.5 JUnit Custom Asserts 3.6 JUnit and Exceptions 3.7 More on Naming 3.8 JUnit Test Skeleton 4 What to Test: The Right-BICEP 4.1 Are the Results Right? 4.2 Boundary Conditions 4.3 Check Inverse Relationships 4.4 Cross-check Using Other Means 4.5 Force Error Conditions 4.6 Performance Characteristics 5 CORRECT Boundary Conditions 5.1 Conformance 5.2 Ordering 5.3 Range 5.4 Reference 5.5 Existence 5.6 Cardinality 5.7 Time 5.8 Try It Yourself 6 Using Mock Objects 6.1 Simple Stubs 6.2 Mock Objects 6.3 Testing a Servlet 6.4 Easy Mock Objects 7 Properties of Good Tests 7.1 Automatic 7.2 Thorough 7.3 Repeatable 7.4 Independent 7.5 Professional 7.6 Testing the Tests 8 Testing on a Project 8.1 Where to Put Test Code 8.2 Test Courtesy 8.3 Test Frequency 8.4 Tests and Legacy Code 8.5 Tests and Reviews 9 Design Issues 9.1 Designing for Testability 9.2 Refactoring for Testing 9.3 Testing the Class Invariant 9.4 Test-Driven Design 9.5 Testing Invalid Parameters A Gotchas A.1 As Long As The Code Works A.2 "Smoke" Tests A.3 "Works On My Machine" A.4 Floating-Point Problems A.5 Tests Take Too Long A.6 Tests Keep Breaking A.7 Tests Fail on Some Machines A.8 My main is Not Being Run B Installing JUnit B.1 Command-line installation B.2 Does it work? C JUnit Test Skeleton C.1 Helper Class C.2 Basic Template D Resources D.1 On The Web D.2 Bibliography E Summary: Pragmatic Unit Testing F Answers to Exercises

77 citations

Journal ArticleDOI
TL;DR: State machines make it easy to eliminate duplication, honoring the DRY principle, and let you write more expressive code, because you can specify intent and implementation independently.
Abstract: We are surrounded by real-world state machines: ballpoint pen retractor mechanisms, vending machines, washing-machine controllers, digital watches. They are a trivial but underused technology that can simplify how we implement programs that must track how they got to their current state before handling a new event. However, many programmers feel that state machines are only useful when they're developing communication protocol stacks, which is not an everyday activity. This is unfortunate. State machines can be appropriate in surprising circumstances. Correctly applied, they will result in faster, more modular, less coupled, and easier to maintain code. State machines make it easy to eliminate duplication, honoring the DRY principle. They also let you write more expressive code, because you can specify intent and implementation independently. These are all good, pragmatic, reasons to investigate them further, so let's look at some simple state machine implementations and problems they can solve.

71 citations


Cited by
More filters
Journal ArticleDOI
TL;DR: An overview of pattern clustering methods from a statistical pattern recognition perspective is presented, with a goal of providing useful advice and references to fundamental concepts accessible to the broad community of clustering practitioners.
Abstract: Clustering is the unsupervised classification of patterns (observations, data items, or feature vectors) into groups (clusters). The clustering problem has been addressed in many contexts and by researchers in many disciplines; this reflects its broad appeal and usefulness as one of the steps in exploratory data analysis. However, clustering is a difficult problem combinatorially, and differences in assumptions and contexts in different communities has made the transfer of useful generic concepts and methodologies slow to occur. This paper presents an overview of pattern clustering methods from a statistical pattern recognition perspective, with a goal of providing useful advice and references to fundamental concepts accessible to the broad community of clustering practitioners. We present a taxonomy of clustering techniques, and identify cross-cutting themes and recent advances. We also describe some important applications of clustering algorithms such as image segmentation, object recognition, and information retrieval.

14,054 citations

Journal ArticleDOI
TL;DR: In this paper, the authors considered factoring integers and finding discrete logarithms on a quantum computer and gave an efficient randomized algorithm for these two problems, which takes a number of steps polynomial in the input size of the integer to be factored.
Abstract: A digital computer is generally believed to be an efficient universal computing device; that is, it is believed able to simulate any physical computing device with an increase in computation time by at most a polynomial factor. This may not be true when quantum mechanics is taken into consideration. This paper considers factoring integers and finding discrete logarithms, two problems which are generally thought to be hard on a classical computer and which have been used as the basis of several proposed cryptosystems. Efficient randomized algorithms are given for these two problems on a hypothetical quantum computer. These algorithms take a number of steps polynomial in the input size, e.g., the number of digits of the integer to be factored.

7,427 citations

Book
01 Jan 2009
TL;DR: This text can be used as the basis for an advanced undergraduate or a graduate course on the subject, or for self-study, and is certain to become the definitive reference on the topic.
Abstract: Analytic Combinatorics is a self-contained treatment of the mathematics underlying the analysis of discrete structures, which has emerged over the past several decades as an essential tool in the understanding of properties of computer programs and scientific models with applications in physics, biology and chemistry. Thorough treatment of a large number of classical applications is an essential aspect of the presentation. Written by the leaders in the field of analytic combinatorics, this text is certain to become the definitive reference on the topic. The text is complemented with exercises, examples, appendices and notes to aid understanding therefore, it can be used as the basis for an advanced undergraduate or a graduate course on the subject, or for self-study.

3,616 citations