Category Archives: Shared Articles

Unit Test Your JavaScript Using Mocha and Chai

This article was peer reviewed by Panayiotis «pvgr» Velisarakos, Mark Brown and Tom Greco. Thanks to all of SitePoint’s peer reviewers for making SitePoint content the best it can be!

Have you ever made some changes to your code, and later found it caused something else to break?

I’m sure most of us have. This is almost inevitable, especially when you have a larger amount of code. One thing depends on another, and then changing it breaks something else as a result.

But what if that didn’t happen? What if you had a way of knowing when something breaks as a result of some change? That would be pretty great. You could modify your code without having to worry about breaking anything, you’d have fewer bugs and you’d spend less time debugging.

That’s where unit tests shine. They will automatically detect any problems in the code for you. Make a change, run your tests and if anything breaks, you’ll immediately know what happened, where the problem is and what the correct behavior should be. This completely eliminates any guesswork!

In this article, I’ll show you how to get started unit testing your JavaScript code. The examples and techniques shown in this article can be applied to both browser-based code and Node.js code.

The code for this tutorial is available from our GitHub repo.

What Is Unit Testing

When you test your codebase, you take a piece of code — typically a function — and verify it behaves correctly in a specific situation. Unit testing is a structured and automated way of doing this. As a result, the more tests you write, the bigger the benefit you receive. You will also have a greater level of confidence in your codebase as you continue to develop it.

The core idea with unit testing is to test a function’s behavior when giving it a certain set of inputs. You call a function with certain parameters, and check you got the correct result.

// Given 1 and 10 as inputs...
var result = Math.max(1, 10);

// ...we should receive 10 as the output
if(result !== 10) {
  throw new Error('Failed');
}

In practice, tests can sometimes be more complex. For example, if your function makes an Ajax request, the test needs some more set up, but the same principle of “given certain inputs, we expect a specific outcome” still applies.

For this article, we’ll be using Mocha. It’s easy to get started with, can be used for both browser-based testing and Node.js testing, and it plays nicely with other testing tools.

The easiest way to install Mocha is through npm (for which we also need to install Node.js). If you’re unsure about how to install either npm or Node on your system, consult our tutorial: A Beginner’s Guide to npm — the Node Package Manager

With Node installed, open up a terminal or command line in your project’s directory.

  • If you want to test code in the browser, run npm install mocha chai --save-dev
  • If you want to test Node.js code, in addition to the above, run npm install -g mocha

This installs the packages mocha and chai. Mocha is the library that allows us to run tests, and Chai contains some helpful functions that we’ll use to verify our test results.

Testing on Node.js vs Testing in the Browser

The examples that follow are designed to work if running the tests in a browser. If you want to unit test your Node.js application, follow these steps.

  • For Node, you don’t need the test runner file.
  • To include Chai, add var chai = require('chai'); at the top of the test file.
  • Run the tests using the mocha command, instead of opening a browser.

Setting up a Directory Structure

You should put your tests in a separate directory from your main code files. This makes it easier to structure them, for example if you want to add other types of tests in the future (such as integration tests or functional tests).

The most popular practice with JavaScript code is to have a directory called test/ in your project’s root directory. Then, each test file is placed under test/someModuleTest.js. Optionally, you can also use directories inside test/, but I recommend keeping things simple — you can always change it later if necessary.

Setting up a Test Runner

In order to run our tests in a browser, we need to set up a simple HTML page to be our test runner page. The page loads Mocha, the testing libraries and our actual test files. To run the tests, we’ll simply open the runner in a browser.

If you’re using Node.js, you can skip this step. Node.js unit tests can be run using the command mocha, assuming you’ve followed the recommended directory structure.

Below is the code we’ll use for the test runner. I’ll save this file as testrunner.html.

<!DOCTYPE html>
<html>
  <head>
    <title>Mocha Tests</title>
    <link rel="stylesheet" href="node_modules/mocha/mocha.css">
  </head>
  <body>
    <div id="mocha"></div>
    <script src="node_modules/mocha/mocha.js"></script>
    <script src="node_modules/chai/chai.js"></script>
    <script>mocha.setup('bdd')</script>

    <!-- load code you want to test here -->

    <!-- load your test files here -->

    <script>
      mocha.run();
    </script>
  </body>
</html>

The important bits in the test runner are:

  • We load Mocha’s CSS styles to give our test results nice formatting.
  • We create a div with the ID mocha. This is where the test results are inserted.
  • We load Mocha and Chai. They are located in subfolders of the node_modules folder since we installed them via npm.
  • By calling mocha.setup, we make Mocha’s testing helpers available.
  • Then, we load the code we want to test and the test files. We don’t have anything here just yet.
  • Last, we call mocha.run to run the tests. Make sure you call this after loading the source and test files.

The Basic Test Building Blocks

Now that we can run tests, let’s start writing some.

We’ll begin by creating a new file test/arrayTest.js. An individual test file such as this one is known as a test case. I’m calling it arrayTest.js because for this example, we’ll be testing some basic array functionality.

Every test case file follows the same basic pattern. First, you have a describe block:

describe('Array', function() {
  // Further code for tests goes here
});

describe is used to group individual tests. The first parameter should indicate what we’re testing — in this case, since we’re going to test array functions, I’ve passed in the string 'Array'.

Secondly, inside the describe, we’ll have it blocks:

describe('Array', function() {
  it('should start empty', function() {
    // Test implementation goes here
  });

  // We can have more its here
});

it is used to create the actual tests. The first parameter to it should provide a human-readable description of the test. For example, we can read the above as “it should start empty”, which is a good description of how arrays should behave. The code to implement the test is then written inside the function passed to it.

All Mocha tests are built from these same building blocks, and they follow this same basic pattern.

  • First, we use describe to say what we’re testing – for example, “describe how array should work”.
  • Then, we use a number of it functions to create the individual tests – each it should explain one specific behavior, such as “it should start empty” for our array case above.

Writing the Test Code

Now that we know how to structure the test case, let’s jump into the fun part — implementing the test.

Since we are testing that an array should start empty, we need to create an array and then ensure it’s empty. The implementation for this test is quite simple:

var assert = chai.assert;

describe('Array', function() {
  it('should start empty', function() {
    var arr = [];

    assert.equal(arr.length, 0);
  });
});

Note on the first line, we set up the assert variable. This is just so we don’t need to keep typing chai.assert everywhere.

In the it function, we create an array and check its length. Although simple, this is a good example of how tests work.

First, you have something you’re testing — this is called the System Under Test or SUT. Then, if necessary, you do something with the SUT. In this test, we’re not doing anything, since we’re checking the array starts as empty.

The last thing in a test should be the validation — an assertion which checks the result. Here, we are using assert.equal to do this. Most assertion functions take parameters in the same order: First the “actual” value, and then the “expected” value.

  • The actual value is the result from your test code, so in this case arr.length
  • The expected value is what the result should be. Since an array should begin empty, the expected value in this test is 0

Chai also offers two different styles of writing assertions, but we’re using assert to keep things simple for now. When you become more experienced with writing tests, you might want to use the expect assertions instead, as they provide some more flexibility.

Running the Test

In order to run this test, we need to add it to the test runner file we created earlier.

If you’re using Node.js, you can skip this step, and use the command mocha to run the test. You’ll see the test results in the terminal.

Otherwise, to add this test to the runner, simply add:

<script src="test/arrayTest.js"></script>

Below:

<!-- load your test files here -->

Once you’ve added the script, you can then load the test runner page in your browser of choice.

The Test Results

When you run your tests, the test results will look something like this:

Mocha test results - 1 test passing

Note that what we entered into the describe and it functions show up in the output — the tests are grouped under the description. Note that it’s also possible to nest describe blocks to create further sub-groupings.

Let’s take a look at what a failing test looks like.

On the line in the test that says:

assert.equal(arr.length, 0);

Replace the number 0 with 1. This makes the test fail, as the array’s length no longer matches the expected value.

If you run the tests again, you’ll see the failing test in red with a description of what went wrong.

Mocha test error - one test failing

One of the benefits of tests is that they help you find bugs quicker, however this error is not very helpful in that respect. We can fix it though.

Most of the assertion functions can also take an optional message parameter. This is the message that is displayed when the assertion fails. It’s a good idea to use this parameter to make the error message easier to understand.

We can add a message to our assertion like so:

assert.equal(arr.length, 1, 'Array length was not 0');

If you re-run tests, the custom message will appear instead of the default.

Let’s switch the assertion back to the way it was — replace 1 with 0, and run the tests again to make sure they pass.

Putting It Together

So far we’ve looked at fairly simple examples. Let’s put what we’ve learned into practice and see how we would test a more realistic piece of code.

Here’s a function which adds a CSS class to an element. This should go in a new file js/className.js.

function addClass(el, newClass) {
  if(el.className.indexOf(newClass) === -1) {
    el.className += newClass;
  }
}

To make it a bit more interesting, I made it add a new class only when that class doesn’t exist in an element’s className property — who wants to see <div class="hello hello hello hello"> after all?

In the best case, we would write tests for this function before we write the code. But test-driven development is a complex topic, and for now we just want to focus on writing tests.

To get started, let’s recall the basic idea behind unit tests: We give the function certain inputs and then verify the function behaves as expected. So what are the inputs and behaviors for this function?

Given an element and a class name:

  • if the element’s className property does not contain the class name, it should be added.
  • if the element’s className property does contain the class name, it should not be added.

Let’s translate these cases into two tests. In the test directory, create a new file classNameTest.js and add the following:

describe('addClass', function() {
  it('should add class to element');
  it('should not add a class which already exists');
});

We changed the wording slightly to the “it should do X” form used with tests. This means that it reads a bit nicer, but is essentially still the same human-readable form we listed above. It’s usually not much more difficult than this to go from idea to test.

But wait, where are the test functions? Well, when we omit the second parameter to it, Mocha marks these tests as pending in the test results. This is a convenient way to set up a number of tests — kind of like a todo list of what you intend to write.

Let’s continue by implementing the first test.

describe('addClass', function() {
  it('should add class to element', function() {
    var element = { className: '' };

    addClass(element, 'test-class');

    assert.equal(element.className, 'test-class');
  });

  it('should not add a class which already exists');
});

In this test, we create an element variable and pass it as a parameter to the addClass function, along with a string test-class (the new class to add). Then, we check the class is included in the value using an assertion.

Again, we went from our initial idea — given an element and a class name, it should be added into the class list — and translated it into code in a fairly straightforward manner.

Although this function is designed to work with DOM elements, we’re using a plain JS object here. Sometimes we can make use of JavaScript’s dynamic nature in this fashion to simplify our tests. If we didn’t do this, we would need to create an actual element and it would complicate our test code. As an additional benefit, since we don’t use DOM, we can also run this test within Node.js if we so wish.

Running the Tests in the Browser

To run the test in the browser, you’ll need to add className.js and classNameTest.js to the runner:

<!-- load code you want to test here -->
<script src="js/className.js"></script>

<!-- load your test files here -->
<script src="test/classNameTest.js"></script>

You should now see one test pass and another test show up as pending, as is demonstrated by the following CodePen. Note that the code differs slightly from the example in order to make the code work within the CodePen environment.

See the Pen Unit Testing with Mocha (1) by SitePoint (@SitePoint) on CodePen.

Next, let’s implement the second test…

it('should not add a class which already exists', function() {
  var element = { className: 'exists' };

  addClass(element, 'exists');

  var numClasses = element.className.split(' ').length;
  assert.equal(numClasses, 1);
});

It’s a good habit to run your tests often, so let’s check what happens if we run the tests now. As expected, they should pass.

Here’s another CodePen with the second test implemented.

See the Pen Unit Testing with Mocha (2) by SitePoint (@SitePoint) on CodePen.

But hang on! I actually tricked you a bit. There is a third behavior for this function which we haven’t considered. There is also a bug in the function — a fairly serious one. It’s only a three line function but did you notice it?

Let’s write one more test for the third behavior which exposes the bug as a bonus.

it('should append new class after existing one', function() {
  var element = { className: 'exists' };

  addClass(element, 'new-class');

  var classes = element.className.split(' ');
  assert.equal(classes[1], 'new-class');
});

This time the test fails. You can see it in action in the following CodePen. The problem here is simple: CSS class names in elements should be separated by a space. However, our current implementation of addClass doesn’t add a space!

See the Pen Unit Testing with Mocha (3) by SitePoint (@SitePoint) on CodePen.

Let’s fix the function and make the test pass.

function addClass(el, newClass) {
  if(el.className.indexOf(newClass) !== -1) {
    return;
  }

  if(el.className !== '') {
    //ensure class names are separated by a space
    newClass = ' ' + newClass;
  }

  el.className += newClass;
}

And here’s a final CodePen with the fixed function and passing tests.

See the Pen Unit Testing with Mocha (4) by SitePoint (@SitePoint) on CodePen.

Running the Tests on Node

In Node, things are only visible to other things in the same file. As className.js and classNameTest.js are in different files, we need to find a way to expose one to the other. The standard way to do this is through the use of module.exports. If you need a refresher, you can read all about that here: Understanding module.exports and exports in Node.js

The code essentially stays the same, but is structured slightly differently:

// className.js

module.exports = {
  addClass: function(el, newClass) {
    if(el.className.indexOf(newClass) !== -1) {
      return;
    }

    if(el.className !== '') {
      //ensure class names are separated by a space
      newClass = ' ' + newClass;
    }

    el.className += newClass;
  }
}


// classNameTest.js

var chai = require('chai');
var assert = chai.assert;

var className = require('../js/className.js');
var addClass = className.addClass;

// The rest of the file remains the same

describe('addClass', function() {
  ...
});

And as you can see, the tests pass.

Mocha terminal output - 4 tests passing

What’s Next?

As you can see, testing does not have to be complicated or difficult. Just as with other aspects of writing JavaScript apps, you have some basic patterns which repeat. Once you get familiar with those, you can keep using them again and again.

But this is just scratching the surface. There’s a lot more to learn about unit testing.

  • Testing more complex systems
  • How to deal with Ajax, databases, and other “external” things?
  • Test-Driven Development

If you want to continue learning this and more, I’ve created a free JavaScript unit testing quickstart series. If you found this article useful, you should definitely check it out here.

20+ Docs and Guides for Front-end Developers (No. 7)

As is often the case in front-end development, it seems we have so much to learn and so little time to do it. I’ve rounded up another 20+ learning resources, interactive playgrounds, and other goodies for front-end learning.

So please enjoy the seventh installment of our Docs and Guides series and don’t forget to let me know of any others that I haven’t yet included.

This is a site from the official Meteor development team, outlining opinions on best-practice application development targeted at intermediate JavaScript developers who are already familiar with Meteor.

Meteor: The Official Guide

Lists in grid format the names and descriptions of all HTML elements in the W3C and WHATWG specs. If you click an element, you’ll also see example code on how it can be used along with a link to the spec.

Gethtml

Maybe you’re like me and you’re tired of seeing so many ES6/ES2015 resources. Or maybe this is the one that you finally sit down with and it gets you over the hump of absorbing everything that’s new in the ECMAScript spec.

Learn ES2015

This one made the rounds a short time ago. If you haven’t seen it and want a fun way to study up on flexbox syntax, this is a very nicely done little interactive game/tutorial.

Flexbox Froggy

Nicolás Bevacqua’s study into JavaScript habits. This seems to be the first such survey that he’s conducted and he received an over 5,000 survey entries.

JavaScript Developer Survey Results

A simple interactive page to help you visualize how each flexbox feature works (flex-wrap, flex-direction, etc).

Flexbox.help

“This collection of information supports you to better find the best CDN for your content delivery needs.”

CDN Comparison

Part of the official Angular 2 docs, this is a one-stop developer guide with options to lookup syntax for JavaScript, TypeScript, and Dart.

Angular Cheat Sheet

More from Nicolás Bevacqua, this time it’s a visualization playground to help you learn JavaScript’s new promises feature. What’s great about this is the ability to step through the visualized code components with the option to save the animated visualization as a GIF.

Promisees

An interactive playground for learning CSS’s background-blend-mode and filter properties.

Filter Blend

This is similar to the previous site, this time it’s a playground to help you understand the mix-blend-mode property.

Mix-Blend-Mode CSS property test

A really nice little interactive tool to help you understand and visualize regular expressions. Includes a quick reference section, an explanation of the expression used, plus the ability to save the expression to a unique URL.

Regular Expressions 101

“A collection of working, practical examples of using service workers in modern web apps. Open your Developer Tools console to view fetch events and informative messages about what each recipe’s service worker is doing.”

ServiceWorker Cookbook

A lookup site to search for JavaScript libraries, frameworks, and plugins, filterable by categories including animation, DOM, forms, helpers, audio, video, and more.

JavaScripting

A set of guidelines for building more secure web properties, covering topics like SSL/TLS, Content Security Policy, cross-site scripting, cookie security, and more.

HTTP Security Best Practice

“A practical guide for developers on how to add accessibility information to HTML elements using the Accessible Rich Internet Applications specification [WAI-ARIA-1.1], which defines a way to make Web content and Web applications more accessible to people with disabilities.”

Notes on Using ARIA in HTML

“A searchable catalog of PostCSS plugins.” If you aren’t yet that familiar with the growing community around PostCSS, this might be a good way to learn about the kinds of plugins available.

PostCSS.parts

A Gist by Paul Irish that lists various front-end features that, when used in JavaScript, will trigger “reflow or layout thrashing”, which is a common performance bottleneck.

What forces layout / reflow

“A listing of every term defined by CSS specs.” Each item links to its place in the spec.

CSS Indexes

This is a question posed on the Q&A site Slant, showing multiple pros and cons, along with user comments, for lots of different IDEs and text editors.

What are the best JavaScript IDEs and editors?

Honorable Mentions…

Suggest Yours

Here are the previous 5 posts in this series:

If you’ve built or know of another learning resource for front-end developers, drop it in the comments and I’ll consider it for a future post.

Benefits of Cross-Functional Teams When Building Microservices

If you want your cross-functional teams to be successful, the first thing you need to do is to make sure that your organization can adapt. The software you create reinforces the culture of your company.

Agility is not the goal: it’s a method to solve a problem. Since the external environment can change faster than a company itself, it may need to change its pace as well. But it isn’t about sending out an email to all employees that the organization applies Scrum starting from next week: the transformation must happen on all levels. You need to make sure that there aren’t any roadblocks within your company that could slow down the speed of information. This applies to everything from feedback loops to knowledge centers that everyone can access, so they don’t need to spend time looking for the information they want to use.

Company culture must be prepared to support the transformation and adapt agile practices. Most people try to avoid being part of the ‘company transformation process’ since mass layoffs usually accompany it. Give people time to adapt and the resources to make it easier for them. Also, if you try to transform the middle managers into coaches first, they can support their colleagues well.

Functional vs cross-functional teams

A team completely owns a product during its whole lifetime. They don’t just create it, they are also responsible for maintaining it. This makes cross-functional teams perfect candidates for building microservices.

In project management, products are the formal definition of the project deliverables that make up or contribute to delivering the objectives of the project.

Separating teams by functions creates distance between them. If a separate QA team does the testing and developers are strictly focusing on writing code, they often don’t care much about testing and your product can end up with a lot of features that don’t work properly. A cross-functional team has individuals with different roles like database engineers, testers, infrastructure engineers, etc. As we can see from numerous examples (such as Amazon, Netflix, and Gilt for example), this can result in an excellent product that works as intended and the users love it.

Functional (or often called “siloed”) departments often adopt an “us vs. them” thinking against other teams. Instead of better productivity, this is more likely to result in hostility against each other. Working with people from different backgrounds also enables you to view the project from a different point of view. This helps understand the real reason behind a conflict and resolve (or even prevent) it.

Project: a piece of code that has to offer some predefined business value, must be handed over to the client, and is then periodically maintained by a team.

Cross-functional teams can ship code faster than functional teams because they can make their own decisions and work independently within an organization. The teams can focus on improving their cycle time and implement continuous deployment in order to solve the challenges they face almost instantly.

Teams can be formed by a manager or by the team itself. In both cases there is an important question that needs to be answered: how should people be grouped together? The two options are by similar function or by similar business.

Similar function

Grouping by similar function means that managers work with other managers, engineers with engineers, or marketers with fellow marketers. Melvin Conway’s law states that “Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.” This is as true today as it was half a century ago. These are called functional units. They work the best if you can manage to hire the best people to build a superb team of specialists who are truly experts in their own field. The similar community enables them to learn from each other to master their job. The biggest challenge is that departments usually have difficulties when communicating with each other. For example, if the task of the UI team is to do an overhaul of the interface but the backend guys are still in the middle of something else, then the whole project will be delayed until the backend tasks are done - since the UI team can't even start the project.

Watch out for these signals. Constantly ordering work across capabilities, splitting stories between teams, having to move people around towards tasks, deploying in lock-step and fan-in for end-to-end testing all mean that Conway’s law is in effect in your organization.

Similar business

In this case, the people work together to deliver the same business value: a new feature a new project, or even a new product.

The teams need to be stable enough to get the job done and in exchange, they can move faster and more efficiently than teams grouped by similar functions. The communication is more likely to be oriented around the goal itself and not around the communication or management issues
across functional units, making this approach more efficient.

Challenges

Nearly 75% of cross-functional teams have challenges with at least three of the following five criteria, according to Harvard Business Review:

  • meeting a planned budget
  • staying on schedule
  • adhering to specifications
  • meeting customer expectations
  • maintaining alignment with the company’s corporate goals

The Kanban community points out that reorganizing already established teams can cost a lot more without having a system to organize the tasks for the teams. Before you decide to reorganize your whole company it may be worth to take a look at what already works and what doesn’t. If the not-so-optimal pace of the organization originates from the confused state of tasks on a low-level, then the reorganization itself won’t do much.

Building microservices

Microservices should be:

  • cheap to replace;
  • quick to scale;
  • fault tolerant;

Above all: they should allow you to go as fast as possible.

Siloed teams spend weeks with iterations. Because the teams build tightly coupled services, manual tests need to be performed at the same time for all services. This is far from going fast: the tests can often last for weeks.

The first steps towards cross-functional teams

When building microservices, teams can be organized around a single business purpose, and focus on continuous delivery to skip the long-lasting test periods.

Continuous delivery is a software development discipline where you build software in such a way that the software can be released to production at any time.

To achieve this, you need a collaborative working environment for everyone involved in delivery. This environment is the first step to have cross-functional teams.

What it means in practice: merge architects, testers, operations and development teams into a single (no bigger than 10-20 people) cross-functional team. This way, teams don’t have to pass a project around until they get the feedback they need, and delivering services don’t need to happen once in weeks.

James Lewis recommends using these best practices on the different levels within your organization:

  • Top-layer, at the line of business (across the whole company)
    • semantic versioning (define a major version of the software that every team can use within the company)
  • Value streams (group of teams within an organization that can deliver business value to the customer)
    • semantic versioning
    • consumer-driven contract testing
  • Inter-team layer (relationship between the individual teams)
    • tolerant reader
    • consumer-driven contract testing

How to make cross-functional teams efficient

To make cross-functional teams truly effective, they have to be able to operate independently. This way, the unit can complete a project or even a whole feature without requiring regular coordination or micromanagement. Of course, you need to know about what’s going on, but if the goals are clearly set, you don’t need to interfere, and all the tasks get done in time. There can be someone that reports to the VP’s or C-level executives, but the QA managers and the other mid-level managers are not a must anymore.

Constant re-evaluation assures that you’re making progress. If the market changes faster than a project develops, it may be necessary to kill it to save precious resources and divert them to another project that could achieve greater results within the same period. It’s not an easy thing to do, but it’s not worth to chase something into a dead end only to find out that you need to turn back.

The optimal size of a microservice is not necessarily ‘micro’. Amazon uses the size that a ‘two-pizza team’ (around a dozen people) can maintain, but there are setups where half a dozen people support half a dozen services. The concept of self-contained systems suggests using services larger than a microservice but still small enough to keep a team busy and provide meaningful value.

Netflix

Netflix decided to go with highly aligned and loosely coupled teams. The company set clear, specific, and broadly understood goals. The interactions between teams are focused on strategy and objectives, not tactics. Although it requires a large investment in management time to be transparent, they feel it was worth it.

Their teams try to keep meetings at the minimum. This is possible because the teams truly trust each other - without requiring layers of approvals. The leaders reach out proactively to help whenever they feel it’s appropriate and don’t focus on supervising each task of the team members.

Cisco

Cross-functional teams need a good project manager more than anything else. Cisco implemented a 3-layer structure: a group of specialists working on their tasks, a smaller core of people who communicate back to their teams and two vice presidents at the top. The conclusion was that every project should have an end-to-end leader who oversees the whole operation, and the individual teams should also have a leader as well. If the goals are clearly established, this setup helps to make sure that the teams won’t miss them.

Takeaways

  • The success with microservices isn’t just about using the right cloud service or container system. Organizations that embrace cross-functional teams can scale more quickly than a company with siloed teams trying to move to a microservice-based architecture. The key for that is effective communication: the right information goes to the right place at the right time.
  • Teams building microservices need sophisticated monitoring and logging setups for each service to keep track of both operational and business metrics. Trace allows you to measure both.
  • Conway’s law creates a loop: teams not just create a software that mirrors the structure of the organization, but it also reinforces the existing hierarchy.
  • Open source projects are a good example to follow: people work together from different functions towards a mutual goal. These projects also follow Conway’s law and become modular and easy to scale.

Our recently published report aims to address questions of Node.js adoption into enterprise organizations for cross-functional teams.


Unit Test Your JavaScript Using Mocha and Chai

This article was peer reviewed by Panayiotis «pvgr» Velisarakos, Mark Brown and Tom Greco. Thanks to all of SitePoint’s peer reviewers for making SitePoint content the best it can be!

Have you ever made some changes to your code, and later found it caused something else to break?

I’m sure most of us have. This is almost inevitable, especially when you have a larger amount of code. One thing depends on another, and then changing it breaks something else as a result.

But what if that didn’t happen? What if you had a way of knowing when something breaks as a result of some change? That would be pretty great. You could modify your code without having to worry about breaking anything, you’d have fewer bugs and you’d spend less time debugging.

That’s where unit tests shine. They will automatically detect any problems in the code for you. Make a change, run your tests and if anything breaks, you’ll immediately know what happened, where the problem is and what the correct behavior should be. This completely eliminates any guesswork!

In this article, I’ll show you how to get started unit testing your JavaScript code. The examples and techniques shown in this article can be applied to both browser-based code and Node.js code.

The code for this tutorial is available from our GitHub repo.

What Is Unit Testing

When you test your codebase, you take a piece of code — typically a function — and verify it behaves correctly in a specific situation. Unit testing is a structured and automated way of doing this. As a result, the more tests you write, the bigger the benefit you receive. You will also have a greater level of confidence in your codebase as you continue to develop it.

The core idea with unit testing is to test a function’s behavior when giving it a certain set of inputs. You call a function with certain parameters, and check you got the correct result.

// Given 1 and 10 as inputs...
var result = Math.max(1, 10);

// ...we should receive 10 as the output
if(result !== 10) {
  throw new Error('Failed');
}

In practice, tests can sometimes be more complex. For example, if your function makes an Ajax request, the test needs some more set up, but the same principle of “given certain inputs, we expect a specific outcome” still applies.

For this article, we’ll be using Mocha. It’s easy to get started with, can be used for both browser-based testing and Node.js testing, and it plays nicely with other testing tools.

The easiest way to install Mocha is through npm (for which we also need to install Node.js). If you’re unsure about how to install either npm or Node on your system, consult our tutorial: A Beginner’s Guide to npm — the Node Package Manager

With Node installed, open up a terminal or command line in your project’s directory.

  • If you want to test code in the browser, run npm install mocha chai --save-dev
  • If you want to test Node.js code, in addition to the above, run npm install -g mocha

This installs the packages mocha and chai. Mocha is the library that allows us to run tests, and Chai contains some helpful functions that we’ll use to verify our test results.

Testing on Node.js vs Testing in the Browser

The examples that follow are designed to work if running the tests in a browser. If you want to unit test your Node.js application, follow these steps.

  • For Node, you don’t need the test runner file.
  • To include Chai, add var chai = require('chai'); at the top of the test file.
  • Run the tests using the mocha command, instead of opening a browser.

Setting up a Directory Structure

You should put your tests in a separate directory from your main code files. This makes it easier to structure them, for example if you want to add other types of tests in the future (such as integration tests or functional tests).

The most popular practice with JavaScript code is to have a directory called test/ in your project’s root directory. Then, each test file is placed under test/someModuleTest.js. Optionally, you can also use directories inside test/, but I recommend keeping things simple — you can always change it later if necessary.

Setting up a Test Runner

In order to run our tests in a browser, we need to set up a simple HTML page to be our test runner page. The page loads Mocha, the testing libraries and our actual test files. To run the tests, we’ll simply open the runner in a browser.

If you’re using Node.js, you can skip this step. Node.js unit tests can be run using the command mocha, assuming you’ve followed the recommended directory structure.

Below is the code we’ll use for the test runner. I’ll save this file as testrunner.html.

<!DOCTYPE html>
<html>
  <head>
    <title>Mocha Tests</title>
    <link rel="stylesheet" href="node_modules/mocha/mocha.css">
  </head>
  <body>
    <div id="mocha"></div>
    <script src="node_modules/mocha/mocha.js"></script>
    <script src="node_modules/chai/chai.js"></script>
    <script>mocha.setup('bdd')</script>

    <!-- load code you want to test here -->

    <!-- load your test files here -->

    <script>
      mocha.run();
    </script>
  </body>
</html>

The important bits in the test runner are:

  • We load Mocha’s CSS styles to give our test results nice formatting.
  • We create a div with the ID mocha. This is where the test results are inserted.
  • We load Mocha and Chai. They are located in subfolders of the node_modules folder since we installed them via npm.
  • By calling mocha.setup, we make Mocha’s testing helpers available.
  • Then, we load the code we want to test and the test files. We don’t have anything here just yet.
  • Last, we call mocha.run to run the tests. Make sure you call this after loading the source and test files.

The Basic Test Building Blocks

Now that we can run tests, let’s start writing some.

We’ll begin by creating a new file test/arrayTest.js. An individual test file such as this one is known as a test case. I’m calling it arrayTest.js because for this example, we’ll be testing some basic array functionality.

Every test case file follows the same basic pattern. First, you have a describe block:

describe('Array', function() {
  // Further code for tests goes here
});

describe is used to group individual tests. The first parameter should indicate what we’re testing — in this case, since we’re going to test array functions, I’ve passed in the string 'Array'.

Secondly, inside the describe, we’ll have it blocks:

describe('Array', function() {
  it('should start empty', function() {
    // Test implementation goes here
  });

  // We can have more its here
});

it is used to create the actual tests. The first parameter to it should provide a human-readable description of the test. For example, we can read the above as “it should start empty”, which is a good description of how arrays should behave. The code to implement the test is then written inside the function passed to it.

All Mocha tests are built from these same building blocks, and they follow this same basic pattern.

  • First, we use describe to say what we’re testing – for example, “describe how array should work”.
  • Then, we use a number of it functions to create the individual tests – each it should explain one specific behavior, such as “it should start empty” for our array case above.

Writing the Test Code

Now that we know how to structure the test case, let’s jump into the fun part — implementing the test.

Since we are testing that an array should start empty, we need to create an array and then ensure it’s empty. The implementation for this test is quite simple:

var assert = chai.assert;

describe('Array', function() {
  it('should start empty', function() {
    var arr = [];

    assert.equal(arr.length, 0);
  });
});

Note on the first line, we set up the assert variable. This is just so we don’t need to keep typing chai.assert everywhere.

In the it function, we create an array and check its length. Although simple, this is a good example of how tests work.

First, you have something you’re testing — this is called the System Under Test or SUT. Then, if necessary, you do something with the SUT. In this test, we’re not doing anything, since we’re checking the array starts as empty.

The last thing in a test should be the validation — an assertion which checks the result. Here, we are using assert.equal to do this. Most assertion functions take parameters in the same order: First the “actual” value, and then the “expected” value.

  • The actual value is the result from your test code, so in this case arr.length
  • The expected value is what the result should be. Since an array should begin empty, the expected value in this test is 0

Chai also offers two different styles of writing assertions, but we’re using assert to keep things simple for now. When you become more experienced with writing tests, you might want to use the expect assertions instead, as they provide some more flexibility.

Running the Test

In order to run this test, we need to add it to the test runner file we created earlier.

If you’re using Node.js, you can skip this step, and use the command mocha to run the test. You’ll see the test results in the terminal.

Otherwise, to add this test to the runner, simply add:

<script src="test/arrayTest.js"></script>

Below:

<!-- load your test files here -->

Once you’ve added the script, you can then load the test runner page in your browser of choice.

The Test Results

When you run your tests, the test results will look something like this:

Mocha test results - 1 test passing

Note that what we entered into the describe and it functions show up in the output — the tests are grouped under the description. Note that it’s also possible to nest describe blocks to create further sub-groupings.

Let’s take a look at what a failing test looks like.

On the line in the test that says:

assert.equal(arr.length, 0);

Replace the number 0 with 1. This makes the test fail, as the array’s length no longer matches the expected value.

If you run the tests again, you’ll see the failing test in red with a description of what went wrong.

Mocha test error - one test failing

One of the benefits of tests is that they help you find bugs quicker, however this error is not very helpful in that respect. We can fix it though.

Most of the assertion functions can also take an optional message parameter. This is the message that is displayed when the assertion fails. It’s a good idea to use this parameter to make the error message easier to understand.

We can add a message to our assertion like so:

assert.equal(arr.length, 1, 'Array length was not 0');

If you re-run tests, the custom message will appear instead of the default.

Let’s switch the assertion back to the way it was — replace 1 with 0, and run the tests again to make sure they pass.

Putting It Together

So far we’ve looked at fairly simple examples. Let’s put what we’ve learned into practice and see how we would test a more realistic piece of code.

Here’s a function which adds a CSS class to an element. This should go in a new file js/className.js.

function addClass(el, newClass) {
  if(el.className.indexOf(newClass) === -1) {
    el.className += newClass;
  }
}

To make it a bit more interesting, I made it add a new class only when that class doesn’t exist in an element’s className property — who wants to see <div class="hello hello hello hello"> after all?

In the best case, we would write tests for this function before we write the code. But test-driven development is a complex topic, and for now we just want to focus on writing tests.

To get started, let’s recall the basic idea behind unit tests: We give the function certain inputs and then verify the function behaves as expected. So what are the inputs and behaviors for this function?

Given an element and a class name:

  • if the element’s className property does not contain the class name, it should be added.
  • if the element’s className property does contain the class name, it should not be added.

Let’s translate these cases into two tests. In the test directory, create a new file classNameTest.js and add the following:

describe('addClass', function() {
  it('should add class to element');
  it('should not add a class which already exists');
});

We changed the wording slightly to the “it should do X” form used with tests. This means that it reads a bit nicer, but is essentially still the same human-readable form we listed above. It’s usually not much more difficult than this to go from idea to test.

But wait, where are the test functions? Well, when we omit the second parameter to it, Mocha marks these tests as pending in the test results. This is a convenient way to set up a number of tests — kind of like a todo list of what you intend to write.

Let’s continue by implementing the first test.

describe('addClass', function() {
  it('should add class to element', function() {
    var element = { className: '' };

    addClass(element, 'test-class');

    assert.equal(element.className, 'test-class');
  });

  it('should not add a class which already exists');
});

In this test, we create an element variable and pass it as a parameter to the addClass function, along with a string test-class (the new class to add). Then, we check the class is included in the value using an assertion.

Again, we went from our initial idea — given an element and a class name, it should be added into the class list — and translated it into code in a fairly straightforward manner.

Although this function is designed to work with DOM elements, we’re using a plain JS object here. Sometimes we can make use of JavaScript’s dynamic nature in this fashion to simplify our tests. If we didn’t do this, we would need to create an actual element and it would complicate our test code. As an additional benefit, since we don’t use DOM, we can also run this test within Node.js if we so wish.

Running the Tests in the Browser

To run the test in the browser, you’ll need to add className.js and classNameTest.js to the runner:

<!-- load code you want to test here -->
<script src="js/className.js"></script>

<!-- load your test files here -->
<script src="test/classNameTest.js"></script>

You should now see one test pass and another test show up as pending, as is demonstrated by the following CodePen. Note that the code differs slightly from the example in order to make the code work within the CodePen environment.

See the Pen Unit Testing with Mocha (1) by SitePoint (@SitePoint) on CodePen.

Next, let’s implement the second test…

it('should not add a class which already exists', function() {
  var element = { className: 'exists' };

  addClass(element, 'exists');

  var numClasses = element.className.split(' ').length;
  assert.equal(numClasses, 1);
});

It’s a good habit to run your tests often, so let’s check what happens if we run the tests now. As expected, they should pass.

Here’s another CodePen with the second test implemented.

See the Pen Unit Testing with Mocha (2) by SitePoint (@SitePoint) on CodePen.

But hang on! I actually tricked you a bit. There is a third behavior for this function which we haven’t considered. There is also a bug in the function — a fairly serious one. It’s only a three line function but did you notice it?

Let’s write one more test for the third behavior which exposes the bug as a bonus.

it('should append new class after existing one', function() {
  var element = { className: 'exists' };

  addClass(element, 'new-class');

  var classes = element.className.split(' ');
  assert.equal(classes[1], 'new-class');
});

This time the test fails. You can see it in action in the following CodePen. The problem here is simple: CSS class names in elements should be separated by a space. However, our current implementation of addClass doesn’t add a space!

See the Pen Unit Testing with Mocha (3) by SitePoint (@SitePoint) on CodePen.

Let’s fix the function and make the test pass.

function addClass(el, newClass) {
  if(el.className.indexOf(newClass) !== -1) {
    return;
  }

  if(el.className !== '') {
    //ensure class names are separated by a space
    newClass = ' ' + newClass;
  }

  el.className += newClass;
}

And here’s a final CodePen with the fixed function and passing tests.

See the Pen Unit Testing with Mocha (4) by SitePoint (@SitePoint) on CodePen.

Running the Tests on Node

In Node, things are only visible to other things in the same file. As className.js and classNameTest.js are in different files, we need to find a way to expose one to the other. The standard way to do this is through the use of module.exports. If you need a refresher, you can read all about that here: Understanding module.exports and exports in Node.js

The code essentially stays the same, but is structured slightly differently:

// className.js

module.exports = {
  addClass: function(el, newClass) {
    if(el.className.indexOf(newClass) !== -1) {
      return;
    }

    if(el.className !== '') {
      //ensure class names are separated by a space
      newClass = ' ' + newClass;
    }

    el.className += newClass;
  }
}


// classNameTest.js

var chai = require('chai');
var assert = chai.assert;

var className = require('../js/className.js');
var addClass = className.addClass;

// The rest of the file remains the same

describe('addClass', function() {
  ...
});

And as you can see, the tests pass.

Mocha terminal output - 4 tests passing

What’s Next?

As you can see, testing does not have to be complicated or difficult. Just as with other aspects of writing JavaScript apps, you have some basic patterns which repeat. Once you get familiar with those, you can keep using them again and again.

But this is just scratching the surface. There’s a lot more to learn about unit testing.

  • Testing more complex systems
  • How to deal with Ajax, databases, and other “external” things?
  • Test-Driven Development

If you want to continue learning this and more, I’ve created a free JavaScript unit testing quickstart series. If you found this article useful, you should definitely check it out here.

20+ Docs and Guides for Front-end Developers (No. 7)

As is often the case in front-end development, it seems we have so much to learn and so little time to do it. I’ve rounded up another 20+ learning resources, interactive playgrounds, and other goodies for front-end learning.

So please enjoy the seventh installment of our Docs and Guides series and don’t forget to let me know of any others that I haven’t yet included.

This is a site from the official Meteor development team, outlining opinions on best-practice application development targeted at intermediate JavaScript developers who are already familiar with Meteor.

Meteor: The Official Guide

Lists in grid format the names and descriptions of all HTML elements in the W3C and WHATWG specs. If you click an element, you’ll also see example code on how it can be used along with a link to the spec.

Gethtml

Maybe you’re like me and you’re tired of seeing so many ES6/ES2015 resources. Or maybe this is the one that you finally sit down with and it gets you over the hump of absorbing everything that’s new in the ECMAScript spec.

Learn ES2015

This one made the rounds a short time ago. If you haven’t seen it and want a fun way to study up on flexbox syntax, this is a very nicely done little interactive game/tutorial.

Flexbox Froggy

Nicolás Bevacqua’s study into JavaScript habits. This seems to be the first such survey that he’s conducted and he received an over 5,000 survey entries.

JavaScript Developer Survey Results

A simple interactive page to help you visualize how each flexbox feature works (flex-wrap, flex-direction, etc).

Flexbox.help

“This collection of information supports you to better find the best CDN for your content delivery needs.”

CDN Comparison

Part of the official Angular 2 docs, this is a one-stop developer guide with options to lookup syntax for JavaScript, TypeScript, and Dart.

Angular Cheat Sheet

More from Nicolás Bevacqua, this time it’s a visualization playground to help you learn JavaScript’s new promises feature. What’s great about this is the ability to step through the visualized code components with the option to save the animated visualization as a GIF.

Promisees

An interactive playground for learning CSS’s background-blend-mode and filter properties.

Filter Blend

This is similar to the previous site, this time it’s a playground to help you understand the mix-blend-mode property.

Mix-Blend-Mode CSS property test

A really nice little interactive tool to help you understand and visualize regular expressions. Includes a quick reference section, an explanation of the expression used, plus the ability to save the expression to a unique URL.

Regular Expressions 101

“A collection of working, practical examples of using service workers in modern web apps. Open your Developer Tools console to view fetch events and informative messages about what each recipe’s service worker is doing.”

ServiceWorker Cookbook

A lookup site to search for JavaScript libraries, frameworks, and plugins, filterable by categories including animation, DOM, forms, helpers, audio, video, and more.

JavaScripting

A set of guidelines for building more secure web properties, covering topics like SSL/TLS, Content Security Policy, cross-site scripting, cookie security, and more.

HTTP Security Best Practice

“A practical guide for developers on how to add accessibility information to HTML elements using the Accessible Rich Internet Applications specification [WAI-ARIA-1.1], which defines a way to make Web content and Web applications more accessible to people with disabilities.”

Notes on Using ARIA in HTML

“A searchable catalog of PostCSS plugins.” If you aren’t yet that familiar with the growing community around PostCSS, this might be a good way to learn about the kinds of plugins available.

PostCSS.parts

A Gist by Paul Irish that lists various front-end features that, when used in JavaScript, will trigger “reflow or layout thrashing”, which is a common performance bottleneck.

What forces layout / reflow

“A listing of every term defined by CSS specs.” Each item links to its place in the spec.

CSS Indexes

This is a question posed on the Q&A site Slant, showing multiple pros and cons, along with user comments, for lots of different IDEs and text editors.

What are the best JavaScript IDEs and editors?

Honorable Mentions…

Suggest Yours

Here are the previous 5 posts in this series:

If you’ve built or know of another learning resource for front-end developers, drop it in the comments and I’ll consider it for a future post.

کاش می شد من کنیز مادرم بودم
بس که زیبا این پرستاریست می مردم..
یکهو اومد به زبونم. تو گوشم صدای نفسای خسته ی مامانه. باید به زمختیه دستاش وازلین بمالم ولی اینا هیچ کدوم راه فرار مناسبی نیست از این عذاب وجدان ضخیم  ... چرا مامانو گذاشتی و رفتی  دنبال زندگیت؟؟؟ آتنا ازت متنفرم!  بهم بگید چقدر عمیق ازم متنفرید ازمنِ بیشعورِ بی وجدانِ خودخواه بگید و با سرکوفت سنگسارم کنید. احتیاج دارم سنگسار بشم این وقت شب که اینجور بیرحم وجدان عذاب نازل می کنه به سرو جونم.

کاش می شد من کنیز مادرم بودم
بس که زیبا این پرستاریست می مردم..
یکهو اومد به زبونم. تو گوشم صدای نفسای خسته ی مامانه. باید به زمختیه دستاش وازلین بمالم ولی اینا هیچ کدوم راه فرار مناسبی نیست از این عذاب وجدان ضخیم  ... چرا مامانو گذاشتی و رفتی  دنبال زندگیت؟؟؟ آتنا ازت متنفرم!  بهم بگید چقدر عمیق ازم متنفرید ازمنِ بیشعورِ بی وجدانِ خودخواه بگید و با سرکوفت سنگسارم کنید. احتیاج دارم سنگسار بشم این وقت شب که اینجور بیرحم وجدان عذاب نازل می کنه به سرو جونم.

شرح حال دل پروانه

پروانه نارنجی با آن خط و خال مشکی گیر افتاده بود کنج دیوار. فکر کردم افتاده توی تار عنکبوت یا بلایی سرش آمده. اما فقط ترسیده بود. فکر می کرد رسیده ته دنیا. ته دنیا همه اش سفید بود و اثری از برگ و درخت و آسمان نبود. کمی می رفت بالا. بعد سر می خورد پایین و باز خودش را می کوبید به سفیدی مطلق. سفیدی بی پایان روبرویش. عمر پروانه چند روز است؟ شاید به مقیاس عمر ما، چند سالی را در این اندوه گذرانده بود که دیگر تمام شد. همه چیز به پایان رسید. بعد تو بالهایش را گرفتی. آنقدر آرام که آن گرد سیاهی که از خالهای پروانه ها به دستهای بچگیم می افتاد، هم به دستهایت نماند. پروانه را درست دو قدم آن طرفتر پر دادی به طرف برگهای چنار. پروانه رفت. رفت و رفت. زنده بود. آسمان روبرویش بود و آن سفیدی مرگبار ترسناک دیگر وجود نداشت. چند سال از عمرش، به مقیاس عمر ما در آن کنج سفید گذشته بود؟ 

شرح حال دل پروانه

پروانه نارنجی با آن خط و خال مشکی گیر افتاده بود کنج دیوار. فکر کردم افتاده توی تار عنکبوت یا بلایی سرش آمده. اما فقط ترسیده بود. فکر می کرد رسیده ته دنیا. ته دنیا همه اش سفید بود و اثری از برگ و درخت و آسمان نبود. کمی می رفت بالا. بعد سر می خورد پایین و باز خودش را می کوبید به سفیدی مطلق. سفیدی بی پایان روبرویش. عمر پروانه چند روز است؟ شاید به مقیاس عمر ما، چند سالی را در این اندوه گذرانده بود که دیگر تمام شد. همه چیز به پایان رسید. بعد تو بالهایش را گرفتی. آنقدر آرام که آن گرد سیاهی که از خالهای پروانه ها به دستهای بچگیم می افتاد، هم به دستهایت نماند. پروانه را درست دو قدم آن طرفتر پر دادی به طرف برگهای چنار. پروانه رفت. رفت و رفت. زنده بود. آسمان روبرویش بود و آن سفیدی مرگبار ترسناک دیگر وجود نداشت. چند سال از عمرش، به مقیاس عمر ما در آن کنج سفید گذشته بود؟ 

دکتروف: می‌شود نسخه‌ای از ترجمه‌ی کتاب‌هایم به فارسی برایم بفرستید؟

ای.ال.دکتروف (E. L. Doctorow)، نویسنده‌ی شهیر آمریکایی که رمان‌های تاریخی‌اش شهرت فراوانی دارد، دو روز پیش در ۸۴ سالگی درگذشت. دکتروف علاوه بر ۱۰ رمان، دو مجموعه داستان کوتاه و جندین مقاله نیز به چاپ رساند. مشهورترین رمان دکتروف، «رگتایم» است که «نجف دریابندری» آن را به فارسی ترجمه کرد. در ایران، دکتروف را بیشتر با این رمان می‌شناسند. دکتروف معتقد بود "نویسندگی فرم پذیرفته‌شده‌ی شیزوفرنی در جامعه است." او جمله‌ی معروفِ بامزه‌ای هم دارد در باب برخی علائم نگارشی در داستان: "من علامت ویرگول را دوست دارم، اما از نقطه‌ویرگول متنفر ام. فکر می‌کنم آن‌ها به داستان تعلق ندارند. هم‌چنین خیلی وقت است که دیگر از دونقطه برای نقل‌قول استفاده نمی‌کنم. دیگر نیازی به آن‌ها ندارم‌، مثل نقطه‌های سیاه در حال پرواز روی صفحه اند." البته امید دارم اگر کسی خواست از این ادعاها کند، قبلش به درجاتی از دکتروف بودن رسیده باشد! القصه، مرگ او مرا یاد گفت‌وگوی سعید کمالی دهقان است با او در نیویورک انداخت که چهار سال پیش انجام داد. گفت‌وگویی ست بس خواندنی: [ادامــه]


سعید کمالی‌دهقان: به‌واسطه‌ی دوست مشترکی ادگار لورنس دکتروف پذیرفت که بروم دیدنش برای یک گفت‌وگوی حضوری. دوشنبه‌ی نسبتا خنک و بارانی‌ای بود و یک ساعت زودتر رسیده بودم سر قرار. دکتروف که حالا با مرگ سلینجر و جان آپدایک شاید در کنار فیلیپ راث یکی از معدود غول‌های زنده‌ی ادبیات آمریکا باشد، خواست که چند دقیقه‌ای طبقه‌ای پایین منتظر شوم و بعد بروم طبقه‌ی بالا به اتاق کارش که در منطقه‌ی اعیان‌نشینی واقع است در وسط منهتن شهر نیویورک. روی صندلی که نشستم روبروی آقای نویسنده، ناخودآگاه چهره‌ی نجف دریابندی آمد توی ذهنم. مترجمی که «رگتایم» و «بیلی‌باتگیت»، دو شاهکار دکتروف را به فارسی برگردانده. هر دوی‌اشان تاسند، سفید مویند، هم‌سن‌و‌سال‌اند با این تفاوت که دکتروف جوان‌تر است، فقط دو سال. در آن لحظه همه چیز، این دو پیرمرد ادبیات آمریکا و ایران را شبیه هم می‌کرد، عینک‌های گردشان، لباس‌های زرشکی رنگ و مهربانی خارج از وصف هر دو و حتی نحوه‌ی ایستادن‌اشان. پیش از گفت‌وگو، دکتروف از رضا براهنی یاد کرد، از روزهای پیش از انقلاب که براهنی را دستگیر کرده بودند و دکتروف به‌واسطه‌ی یک ناشر آمریکایی برای کتابی از او مقدمه نوشت. شروع که کردیم به گفت‌وگو، به دستگاه ضبط من نگاهی انداخت و ‌گفت: «مطمئنی ضبط می‌کند؟ چراغش خاموش است.» روشن که کردم تا خاموشی بعدی، یک ساعتی و نیمی طول کشید.

نویسنده‌‌ی سبک‌گرایی نیستید. هر یک از کتاب‌هایتان سبک خودش را دارد. یادم می‌آید که جایی گفته بودید همینگوی در سال‌های آخر زندگی، نویسنده‌ی موفقی نبود چون شیفته‌ی سبکش شد.

همینگوی صدای خودش را شنید و این برایش شد مثل یک زندان. من این‌طور فکر می‌کنم. همینگوی مشکلات زیادی داشت، تنها مشکلش آثارش نبود، سال‌های زیادی از جسمش سوءاستفاده کرد،‌ مدام تصادف می‌کرد و کلی زخمی شد. مرتب مسافرت می‌رفت، حتی به آفریقا سفر کرد، بیش از اندازه می‌نوشید و همچنین پدری داشت که خودکشی کرده بود، چیزهایی زیادی بود که باعث شد آن حرف را بزنم، منظورم این نبود که همینگوی فقط به این خاطر خودکشی کرد که به محدودیت‌های شخصی‌اش پی برده بود، محدودیت‌هایی که گریبان خودش را هم گرفت اما محدویت‌های شخصی هم حتما نقشی داشته. اما دوست دارم این طور فکر کنم که هر کتابم سبک خودش را داشته. کتاب‌هایم با یک تصویر یا یک عبارت، یا یک جمله یا حتی یک آوا شروع می‌شود. با چیزی شروع می‌کنم به نوشتن که مرا بکشد به سوی خودش، که تشویقم کند برای ادامه دادن. کتاب‌های من همینطور شروع می‌شود، از نیازی به فکر کردن. هیچ وقت طرحی کلی برای داستان‌هایم ندارم،‌ گاهی گمانه‌هایی می‌زنم که چه کار می‌خواهم بکنم در نهایت اما چون این‌طوری می‌نویسم، صداهای درون کتاب‌هایم با یکدیگر متفاوتند و سبک‌های آن‌ها هم با هم تفاوت دارند. به همین خاطر بعضی از کتاب‌هایم روایت خطی دارند و بعضی‌ها در ساختار کولاژند. خیلی از مواقع از روایت اول شخص استفاده می‌کنم، چون تصورم این است که ابزار بسیار مفیدی است، چون به این شکل راوی بخشی از خود داستان می‌شود. اما تصورم این است که هیچ صدای مشخصی به نام صدای دکتروف وجود ندارد، یا اینکه سبکی وجود ندارد که بشود به آن گفت سبک دکتروف. به همین خاطر نمی‌شود صفحه‌ای را باز کنید و بگویید که حتما این متن نوشته‌ی دکتروف است. نویسنده‌هایی هستند که اگر نوشته‌هایشان را بخوانید، می‌توانید بفهمید که نوشته‌ی کیست، مثل هنری جیمز. اما دلم می‌خواهد که این طوری باشد که هر یک از کتاب‌هایم سبک و لحن خودش را داشته باشد. و خودم نامرئی باشم در کتاب. شاید این‌ها وهم و خیال من باشد و در واقع موفق نشده باشم که این کار را بکنم اما خیلی خوب می‌شود که خودتان را نشناسید در کتاب خودتان. اگر بشناسید، توی همان چاهی می‌افتید که همینگوی درش افتاد، در جایی که همینگوی انعکاس صداهای پیشینش را می‌شنید. شاید این‌ها توهم من باشد اما به عنوان یک نویسنده تلاشم این است که صادق باشم.

پس با توجه به چیزی که شما فکر می‌کنید، به خاطر سبک نویسندگی‌اش بود که موفق نشد یا سبک زندگی‌؟

همینگوی به انبوهی از آشفتگی تبدیل شده بود. شخصیت جنگجویی داشت. یادم می‌آید که از کالج آمده بودم بیرون و داشتم کنار دکه‌ی روزنامه راه می‌رفتم که عناوین خبرها نظرم را جلب کرد: «همینگوی خودکشی کرد.» به نظرم می‌آید که همینگوی در سال‌های پایانی عمرش داشت تلاش می‌کرد که همینگوی نباشد. و کتابی هم منتشر شد بر اساس دستنوشته‌ا‌ی ناتمام و طولانی. همینگوی توی این کتاب تقلا کرده بود که از غرایز همیشگی‌اش فاصله بگیرد و کمی مازوخیست نباشد. اما وقتی این کتاب را بر اساس دستنوشته‌هایش گردآوری کردند، در نهایت هم معلوم بود که کار، کار همینگوی است، تنها کمی کمتر. همینگوی در آغازین سال‌های نویسندگی‌اش برای خودش یک استراتژی معین کرد و طبق آن استراتژی، می‌فهمید که چطور یک داستان را ساختاربندی کند و طبق همان استراتژی، محور اصلی داستانش را خیلی واضح و مبرهن بیان نمی کرد. توی داستان‌های همینگوی، طبق همان استراتژی پیش از نوشتن، موضوع اصلی داستان طوری بود که شخصیت‌های داستان می دانستند ماجرا از چه قرار است اما شما به عنوان خواننده نمی‌دانستید و باید خودتان آن را کشف می‌کردید که به هر حال چیز خیلی هوشمندانه‌ای هم بود. جویس هم یک کم از این کارها کرد، خصوصا توی «دوبلینی‌ها». این طوری است که در یک زمان مشخصی هستید و شخصیت‌ها دارند به طور مشخصی عمل می‌کنند اما به شما به عنوان خواننده توضیح داده نمی‌شود که ماجرا از چه قرار است. جویس گفته بود که قصد دارد به داستان‌هایش یک‌کم حالت وحی و تجلی بدهد، طوری که وقتی خواننده داستان را تمام کرد همه چیز برایش واضح هست اما چون موضوع اصلی درباره‌ش حرف زده نشده و توضیحی داده نشده، در نهایت آن موضوع به شکل قوی‌تری به خواننده منتقل می‌شود. و البته به همراه یک سری صحنه‌های دراماتیزه شده. همینگوی تا جایی پیش رفت که این استراتژی‌ را در کتاب «ناقوس‌ها برای که به صدا در می‌آیند» هم به کار برد، طوری که ساختار کتاب یک کم ضعیف از کار درآمده. استراتژی همینگوی استراتژی‌ای نبود که شما بتوانید همه‌ی عمرتان بهش تکیه کنید. این را هم بگویم که همینگوی در اوجش، نویسنده‌ی بزرگی بود.

وقتی با دوبلینی‌ها مقایسه کردید؛ همین مقایسه را مثلا با کتاب «نه داستان» سلینجر می‌شود کرد؟ سلینجر هم همین ترفند را به کار نبرده؟

خب سلینجر دوست همینگوی بود. با همدیگر تماس داشتند. برایم خیلی جالب است که همینگوی هیچ وقت نتوانست برای همیشه با یک نویسنده دوست بماند. مرد حسودی بود. دوس پاسوس دوستش بود اما سلینجر یک نویسنده‌ی جوانی بود که همینگوی را می‌پرستید و همینگوی هم به همین خاطر به او پاسخ می‌داد، اما بله، بعضی‌ از داستان‌های سلینجر هم همینگونه هست. به شما به عنوان خواننده زیاد توضیح داده نمی‌شود که ماجرا از چه قرار است. که دارد چه اتفاقی می‌افتد. اما فکر نمی‌کنم که سلینجر در همان سطح و سطوح بوده باشد.

فکر می‌کنید که برای همینگوی این استراتژی و سبک تبدیل به یک تله شد؟ به نظر شما همینگوی شیفته‌ی کلمات خودش شد با وجودی که می‌دانیم چقدر به کلمات حساس بود و ساعت‌ها وقت می‌گذاشت برای کلمات مناسب و حتی با وجودی که اعتقاد داشت باید جملاتی که شیفته‌ی آن شده‌اید را دور بیاندازید؟

در زمان خودش همینگوی نویسنده‌‌ای انقلابی بود. اگر با گذشت زمان، ادبیاتش کمرنگ‌تر شود، خودش اما به عنوان یکی از مهم‌ترین چهره‌های تاریخ ادبیات ماندگار خواهد ماند. چون زبان‌بازی‌ها و گزافه‌گویی‌ها را کنار زد و تلاش کرد جملات ساده بنویسد.جملات تمیز. جملات سرراست و تلاش می‌کرد از صفت‌ها و قیدها دوری کند و جمله‌ را به همان شکل ساده به درجه‌ای از قدرت و گیرایی برساند. البته در آخر برای خودش مشکل ایجاد کرد همین قضیه.

و این قضیه باعث شد خیلی‌ها هم از همینگوی الگوبرداری کنند؟
تاثیر زیادی روی خیلی‌ها گذاشت، مثلا روی یک سری نویسنده‌ی داستان‌های اسرارآمیز. داشیل همت و آن کسی که خواب بزرگ را نوشت، اسمش چه بود؟ [ریموند چندلر]. خیلی از نویسنده‌های اسرار آمیز بودند که بدون همینگوی وجود نداشتند.




از همینگوی فاصله بگیریم. کتاب‌های شما درباره‌ی وقایع تاریخی هستند، چه شد به جای اینکه بروید سراغ تاریخ، رفتید سراغ رمان و به جای آنکه مورخی باشید که درباره‌ی تاریخ بنویسد، ترجیح دادید رمان‌نویسی باشید که درباره‌ی تاریخ می‌نویسد؟

من هیچ وقت متوجه نشده بودم که دارم درباره‌ی گذشته می‌نویسم تا اینکه ناشرم بعد از کتاب رگتایم به من گفت که این کتاب درباره‌ی گذشته است، درباره‌ی تاریخ است. من فکر نمی‌کنم که رمان‌ تاریخی می‌نویسم. من هیچ پیشوند و پسوندی را به کلمه‌ی رمان‌نویس نمی‌پذیرم. من یک رمان‌نویس هستم و نه یک رمان‌نویس نیویورکی و نه یک رمان‌نویس تاریخی یا یک رمان‌نویس پست‌مدرن. چرا من تاریخ‌نویس نشدم؟ چون از بچگی دلم می‌خواست که داستان بنویسم و رمان بخوانم. از کتاب‌های کمیک گرفته تا سوپرمن و بت‌من و رمان‌های ورزشی و رمان‌های ماجراجویانه و بعدها هر جور رمانی که جالب به نظر می‌رسید. رمان‌هایی از سروانتش و داستایفسکی و دیکنز. کلی کتاب داشتیم توی خانه‌. همه‌ی کتاب‌های مارک تواین را داشتیم و من هم همه‌ی آن‌ها را خواندم. من همیشه به داستان علاقه‌مند بودم و نه به کتاب‌های تاریخی. موقع خواندن «کونت دو مونت کریستو» یا «جنگ و صلح» به کلی شخصیت‌ تاریخی بر می‌خوردم. آدم‌هایی که می‌شناختم‌اشان. آدم‌های قابل تشخیص تاریخی. مثل ناپلئون. وقتی رگتایم را می‌نوشتم تصور نمی‌کردم که من هم دارم همین‌کار را می‌کنم، البته رگتایم کتاب بدیعی بود در نوع خودش، طوری که مردم ممکن بود تصور کنند که چیز جدیدی است که قبلا همچین چیزی منتشر نشده. اما من یک فرضیه دارم و آن این است که همه‌ی رمان‌ها درباره‌ی گذشته‌اند.

همه رمان‌ها. رمان‌هایی درباره‌ی گذشته‌ی نزدیک و رمان‌هایی درباره‌ی گذشته‌ی دور. چطور تشخیص می‌دهیم که یک رمان تاریخی است؟ وقتی که آدم‌های معروف و شناخته شده توی آن باشد؟ رئیس‌جمهورها و ژنرال‌ها یا هرکس دیگری. یک کتاب نوشتم به نام «نمایشگاه جهانی». برای شخصیت‌های آن کتاب از خانواده‌ی خودم استفاده کردم و حتی از اسم‌هایشان. اما کتابی تاریخی محسوب نمی‌شود. هیچ فرقی نمی‌کند چه از آدم‌هایی استفاده کنید که همه می‌شناسند و چه از آدم‌هایی استفاده کنید که تعداد اندکی می‌شناسند. به این نمی‌گویند کتاب تاریخی. مثلا همین دوست شما ارنست همینگوی، کتاب «ناقوس‌ها برای که به صدا در می‌آیند» را زمانی نوشت که جنگ داخلی اسپانیا هنوز تمام نشده بود. مثل آندره مالرو که کتاب «امید» را وقتی نوشت که هنوز جنگ تمام نشده بود. بعضی از این کتا‌ب‌ها زمانی نوشته شد که جنگ هنوز تمام نشده بود اما نویسنده‌هایشان این‌ طور وانمود کردند که تمام شده. وقتی به آن کتاب‌ها اشاره می‌شود، کتاب تاریخی هستند؟ در آن‌ کتاب‌ها، از آدم‌هایی نام برده شده که هنوز مشغول جنگیدن بودند. وقتی که کتاب می‌نویسید، می‌توانید به هر زمانی سفر کنید و با هیچ مرزی روبرو نباشید. هیچ مرز جغرافیایی یا روحی یا زمانی نیست که شما را محدود کند. زمان معنایی ندارد. زمان تنها یک وسیله است برای روایت یک داستان. ویلیام فاکنر یک قلمروی خیالی داشت به نام «یوکناپاتافا» و آن قلمرو به یک چارچوب تبدیل شد برای کارهایش. چیزی که من در «کتاب دانیل» و بعدها در «رگتایم» کشف کردم این بود که می‌شود رمان نوشت و ساختارش را بر زمان بنا کرد و نه بر مکان. ویلیام فاکنر یک قلمرو در می‌سی‌سی‌پی دارد و من اولین دهه‌ی قرن بیست را داشتم و آن دهه چهارچوب رمان من شد.

دلیل دوم که من مورخ نیستم این است که اصلا اهل تحقیق کردن نیستم. من محقق خوبی نیستم. از من می‌پرسند که برای نوشتن کتاب‌هایت چقدر تحقیق می‌کنی و من می‌گویم به قدر کافی. نویسنده‌های زیادی را می‌شناسم که آن‌قدر تحقیق می‌کنند که نمی‌توانند در نهایت درباره‌اش بنویسند چون زیاده از حد می‌دانند. اگر در حالی که می‌نویسید بخواهید نگاه هم بکنید که نمی‌شود. اگر دنبال چیزی باشید به نحوی پیدایش می‌کنید، به شکل مخصوص خودش. البته در کتاب «رژه» من یک کم بیشتر از کتاب‌های دیگرم تحقیق کردم. من داشتم تحقیق می‌کردم بدون اینکه خودم بدانم دارم تحقیق می‌کنم. داشتم خاطرات «ژنرال شرمن» و ژنرال‌های دیگری را می‌خواندم و اصلا به فکرم هم نمی‌رسید که بعدها بخواهم درباره‌اشان کتابی بنویسم. وقتی شروع به نوشتن کتاب کردم دیدم که چیزهایی در مغزم هست که آن‌ها را می‌دانم. واقعیت این است که تاریخ‌نگاری اصلا مرا خوشنود نمی‌کند.

درباره‌ی نوشتن «رگتایم» یک‌جایی گفته‌اید که به عکسی از «جی پی مرگان» نگاه کردید و شروع کردید به نوشتن. اینکه منبع شما درباره‌ی مرگان همان عکس بوده. نمی‌ترسیدید از اینکه حق مطلب را ادا نکنید؟

وقتی از شخصیتی استفاده می‌کنید که کار مهمی در زندگی کرده، مثلا یک آدم شناخته شده، دارید همان کاری را می‌کنید که نقاش می‌کند در کشیدن یک پرتره، وقتی نقاشی پرتره‌ی شما را می‌کشد، آن پرتره با خود شما فرق می‌کند، قضاوت و دید نقاش است از شما که روی بوم آمده. یک طور واکنش به حضور شما در آن نقاشی است و آن پرتره، شما نیستید. در واقع دو چیز هست، یکی شما و دیگری آن پرتره. این همان کاری است که نویسنده می‌کند، یک شخصیت تاریخی را تاویل می‌کند و فکر می‌کنم که کار اشتباهی نباشد. آدم‌های مشهور برای تخیل ما مفید هستند. آدم‌های مشهور اغلب موارد سعی می‌کنند یک داستان خیالی از خودشان به جهان ارائه کنند، یعنی آن چیزی که خودشان از خودشان ارائه می‌کنند اصولا یک‌کم خیالی است، این‌ها همه پیش از آن است که یک نویسنده برود سراغ‌شان. بگذارید یک چیز خنده‌دار بگویم، اگر می‌خواهید بهترین رمان را درباره‌ی «جی پی مرگان» بخوانید، بروید زندگی‌نامه‌ی رسمی مرگان را بخوانید. اینجا رسم است که سیاست‌مداران پس از اتمام خدمت یک کتاب می‌نویسند تا بگوید که مثلا فلان‌طور بوده‌اند، از شما می‌خواهند تا پرتره‌ای که خودشان از خودشان ارائه می‌دهند را بپذیرید، و اصولا آن چیزی که ارائه می‌دهند، خیلی خیالی است. مثلا «هنری کسینجر» کتاب‌های زیادی نوشته و ادعا می‌کند که جانب بی‌طرفی را رعایت کرده درباره‌ی دست‌آوردهای به ‌اصطلاح مهم‌اش.

کتاب «رژه» در جنگ داخلی آمریکا می‌گذرد، «رگتایم» در دهه‌ی نخست قرن بیستم اتفاق می‌افتد. به‌نطر می‌رسد که از شخصیت‌ها یا همان‌طور که گفتید از بازه‌های زمانی استفاده می‌کنید برای پوشش دادن بخشی از تاریخ آمریکا. وقتی کتاب «هومر و لنگلی» را نوشتید، می‌خواستید کتابی بنویسید درباره‌ی هومر و لنگلی چون شیفته‌ی شخصیت‌شان شده بودید یا تصمیم داشتید از داستان آن دو برادر استفاده کنید برای توصیف نیویورک در دهه‌ی چهل و پنجاه قرن گذشته‌؟ کدامیک مقدم بوده، داستان هومر و لنگلی یا آن برهه‌ی تاریخی؟

مقدم‌ترین چیز در کتاب من نخستین جمله‌ی کتاب است. «من هومر هستم، برادر کوره» و وقتی این را می‌نوشتم اصلا تصور نمی‌کردم که چنین کتابی بشود، یعنی کتابی درباره‌ی هومر و لنگلی. عاشق آن جمله بودم. شروع خوبی بود، آن جمله مرا مجبور می‌کرد که ادامه دهم. درباره‌ی هومر و لنگلی می‌دانستم از قبل. اسطوره‌های نیویورک بودند برای سالیان سال و روزنامه‌ها نقش داشتند در اسطوره کردن آن‌ها. برادرانی که عاشق جمع کردن آت و آشغال بودند و هیچ کس آن موقع از نظر انسان‌شناسی برای رفتار این دو نامی نداشت. مثل اختلال رفتاری یا نوعی از وسواس. آن‌ها به افسانه‌های نیویورک تبدیل شده بودند. من به گوشه‌گیری آن‌ها علاقه‌مند نبودم و یا به آن جنبه از شخصیت‌اشان که علاقه داشت به گردآوری اشیاء، من به این علاقه داشتم که چطور شد که این‌ها این طور شدند؟ هومر و لنگلی از خانواده‌ی ثروتمندی آمده بودند، پدر پزشکی داشتند و مادر قابل احترامی و خیلی هم با جامعه‌ی شهر نیویورک ارتباط داشتند و خانه‌ی خوبی در محله‌ی خوبی داشتند اما وقتی پدر و مادرشان رفتند، این دو برادر درهای خانه را به روی همه بستند و تا جایی که می‌توانستند خودشان را جدا کردند از جامعه‌ی بیرون و من در کتابم آن‌ها را به متصدیان یا موزه‌داران زمان و ذهن خودشان تبدیل کردم. به آدم‌هایی که مثل موزه‌داران در حال جمع‌آوری تکه‌های متفاوت زمان و ذهن زندگی خودند. خانه‌اشان مثل موزه شده بود.

و البته هومر و لنگلی کتاب شما با هومر و لنگلی واقعی فرق‌هایی هم می‌کند، مثلا سن‌هایشان را تغییر دادید. چه شد که این کار را کردید. مثلا یک‌دفعه تصمیم گرفتید که خب من سن‌های این دو را تغییر بدهم؟

من اصلا قصد نداشتم که زندگی این دو را مستند کنم. یا اینکه بیماری این‌ها را مستند کنم. من به این دو به عنوان افسانه علاقه داشتم. وقتی سراغ اسطوره‌ها می‌روید، زندگی آن‌ها را تفسیر می‌کنید برای خودتان. من هم آن دو را تفسیر کردم به روش خودم. خانه‌ی اصلی آن‌ها مثلا در منطقه‌ی شمالی‌تری در نیویورک واقع بود و من جایش را تغییر دادم و آوردم کمی پایین‌تر. باید به یاد داشته باشید که وقتی دارید درباره‌ی چیزی می‌نویسید که در گذشته اتفاق افتاده، در اصل درباره‌ی گذشته‌ی خودتان هم دارید می‌نویسید. چرا من رفتم و درباره‌ی هومر و لنگلی نوشتم؟ منتقدی می‌گفت که رمان «هومر و لنگلی» درباره‌ی آنتروپی [اصطلاحی در فیزیک به معنای افت و رکود] است. این که انرژی در حال کاهش و کم شدن است. یکی گفت به شکلی نشان‌دهنده‌ی زندگی امروز آمریکا است. این‌ها تفسیر بقیه‌ی آدم‌هاست. آدم‌ها این‌طوری می‌گویند، یا واکنش نشان می‌دهند، چون طبیعتا هر آدمی در گذشته مشکلات خودش را داشته به عنوان یک انسان. مثلا مشکلات شخصی. یا مشکلات اقتصادی و رکود اقتصادی. فقط داستان‌نویس‌ها نیستند که درباره‌ی گذشته حرف می‌زنند، سیاست‌مدارن هم سراغ گذشته می‌روند.

«هومر و لنگلی» یک طور واکنش به سیاست‌های «جورج بوش» هم بود؟ یک جور به سخره گرفتن همه‌ی چیزهایی نبود که توی این سال‌ها برای آدم‌ها ارزشمند شده؟

شما همیشه در حال واکنش به زمان خودتان هستید و این واقعیت دارد. مردم تاریخ را می‌نویسند تا نیازهای امروز جامعه برطرف شود یا مشخص و معین شود. «رژه» را بعد از آن نوشتم که «جورج بوش» ما را برد به جنگ. تنها کتابی بود که آن موقع می‌توانستم بنویسم.

تاریخ همیشه درباره‌ی حقیقت است و رمان‌ها درباره‌ی ماجراهای خیالی یا دروغین. بعضی‌ها می‌گویند رمان‌نویس‌ها دروغ‌گوهای خوبی هستند.

وقتی رمانی را بر می‌دارید بخوانید، مطمئنید که خیالی است اما وقتی یک سیاست‌مدار حرف می‌زند، ادعا می‌کند که خیالی حرف نمی‌زند. سیاست‌مداران هم مثل نویسنده‌ها به خوبی می‌دانند که به راحتی می‌شود واقعیت‌ها را تغییر داد. می‌شود آن‌ها را تغییر دارد یا شکل‌شان را عوض کرد، به هر شکل ممکنی. هر دو این قضیه را به خوبی می‌دانند و به همین خاطر است که سیاست‌مدارها همیشه با داستان‌نویس‌ها مشکل دارند. هنری جیمز می‌گوید رمان‌نویس خودش را با نوشتن داستان سرگرم می‌کند، تا حقیقت نادیده را ببیند. برای دیدن حقیقت نادیده شاید مجبور شوید که بعضی چیزهای را عوض کنید یا تغییر دهید اما حقیقت خودش آنجاست و تغییر نمی‌کند. حقیقت را نمی‌شود تنها بواسطه مجموعه‌ای از واقعیت‌ها دید، این نظر رمان‌نویس است. اینکه حقیقت‌های بزرگتری وجود دارد. با نوشتن جملاتی که واقعیت ندارد، از حقیقت محروم نمی‌شوید. هنری جیمز در هنر رمان‌نویسی به همین قضیه اشاره می‌کند که رمان‌نویس درک و هوشی دارد که می‌تواند از ناکجاآباد مطلب بگیرد و آن را روی کاغذ بیاورد. موهبت جمله‌ای که بر اساس واقعیت‌ها نباشد، این است که می‌تواند در دامنه‌ی تخیلات سیر کند تا حقیقت بزرگتری را بیابد. مثلا تولستوی در ناپلئون چیزهایی می‌دید که مورخان آن‌ها را ندیدند. مثلا ناپلئون را در حالتی توصیف کرد که با ژنرالی حرف می‌زد و شانه‌هایش از خشم می‌لرزید، کدام مورخ حاضر است همچین چیزی بنویسد؟ و اینکه نمی‌توانست به خوبی اسب دوانی کند و اینکه شخصیت خودپسندی داشت. نویسنده چیزهایی را در داستان‌اش اضافه می‌کند و از چیزهایی چشم پوشی می‌کند و این طور است که در نهایت حقیقت نمایان می‌شود.

جان آپدایک جایی گفته بود که شما با این سبک نوشتن وقایع تاریخی را به یک جور بازی تبدیل کردید در نوشتن کتاب‌هایتان. این طور نوشتن و این‌طور رفتار کردن با شخصیت‌ها و وقایع تاریخی، بازی است برای شما؟

نه بازی نیست. من آپدایک را دوست داشتم، اما من و آپدایک خیلی باهم تفاوت داشتیم. آپدایک خیلی فلسفی می‌نوشت و خیلی محافظه‌کار بود به عنوان یک نویسنده. اما قبول ندارم که این‌ها برای من بازی است. آپدایک منظورش احتمالا این بوده که من با شخصیت‌های کتابم خیلی حال می‌کردم. برای آپدایک کتاب من یک‌کم دست چپی بود، آپدایک یک‌کم دست راستی بود نسبت به من. در آمریکا وقتی درباره‌ی طبقه‌ی کارگر حرف می‌زنید شما را دست چپی حساب می‌کنند، در تاریخ این کشور کتاب‌های خیلی کمی هست که درباره‌ی طبقه‌ی کارگر نوشته شده باشد. کتاب‌های خوب کمی داریم درباره‌ی موضوع کسب و کار. در آمریکا، بیشتر رمان‌های خوب درباره‌ی طبقه‌ی متوسط جامعه است. در این کشور رمان سیاسی زیاد محبوب نبوده. منتقدهایمان هم زیاد اهل رمان سیاسی نیستند. وقتی یک رمان سیاسی در کشور دیگری نوشته می‌شود، منتقدهای ما به انتشار آن واکنش نشان می‌دهند و نقدش می‌کنند. مثلا استقبال می‌کنند از کتاب‌هایی که نویسندگان سفیدپوست آفریقای جنوبی نوشته‌اند درباره‌ی آپارتاید. اما همین آدم‌هایی که رمان‌ سیاسی کشورهای دیگر را دوست دارند، رمان‌ سیاسی آمریکایی را نمی‌پسندند یا دوست ندارند اینجا رمان سیاسی نوشته شود.

درباره‌ی آن تصویری حرف زدیم که با دیدنش شروع کردید به نوشتن درباره‌ی شخصیت «جی پی مرگان» در کتاب رگتایم. فکر نمی‌کنید رگتایم آلبوم عکسی باشد از شخصیت‌های تاریخی آن دوره‌ی آمریکا؟

همچین توصیفی درباره‌ی کتابم نشنیده بودم تا به حال. اما توصیف جالبی است. آن طوری که من آن کتاب را نوشتم خیلی خود به خود بود. یعنی خودش خودش را به وجود آورد. مثلا شخصیت سیاهپوست کتاب یا همان «کلهاس واکر»، من در خلق کردن آن از یک نویسنده‌ی آلمانی الهام گرفتم، نویسنده‌ای به نام «هاینریش فون کلایست»، که اوایل قرن نوزده میلادی می‌نوشت،‌ و رمان کوتاه زیبایی نوشت به نام «میشائیل کلهاس» [نشر ماهی؛ ترجمه: محمود حدادی]، کلهاست یک دلال اسب است و اسب‌ها را می‌برد برای فروش اما به او می‌گویند که باید عوارض بدهد و او هم که زیر بار عوارض نمی‌رفته، می‌رود برای پرس و جو و در این بین اسب‌هایش مورد آزار و اذیت قرار می‌گیرند و بعد به دنبال حق‌طلبی می‌رود و در نهایت به شخصیتی انقلابی‌ تبدیل پیدا می‌کند. این آدم الهامی شد برای شخصیت «کلهاس واکر» رمان رگتایم. از من می‌پرسند که فلان و بهمان چیز واقعا برای کلهاس، موسیقیدان سیاه‌پوست، اتفاق افتاده و من می‌گویم که یادم نمی‌آید که اتفاق افتاده باشد اما سال‌ها بعد از نوشتن رگتایم یک عکسی را دیدم از یک آدم سیاه‌پوستی در کنار ماشینش که غارت شده بود [همان تصویری که دکتروف در رگتایم آورده]. منظورم همچنین چیزی است وقتی می‌گویم نویسنده در داستان خیالی به نحوی حقیقت را در می‌یابد. آلبوم عکس؟ نمی‌دانم، آدم‌ها می‌گویند که کتاب‌های من خیلی تصویری و سینمایی هستند و تا به حال هم چندین فیلم بر اساس کتاب‌هایم ساخته شده و کارگردان‌ها به من گفته‌اند که چقدر سخت‌ا‌شان بوده که رمانم را فیلم کنند. تا به حال نشینده بودم که یکی بگوید آلبوم عکس. توصیف خوبی است.

چقدر بیلی کتاب «بیلی باتگیت» به خود شما و خصوصا آرمان‌ها و آرزوهایتان در جوانی شباهت دارد؟

وقتی جوان بودم خیابان‌های زیادی را پشت سر می‌گذاشتم تا به یک کتاب‌خانه‌ی عمومی برسم و در این مسیر از منطقه‌ی «برانکس شرقی» رد می‌شدم، که محله‌ی خشنی بود و زیاد هم برای جوانی به سن و سال من مناسب نبود که آنجا تنهایی بپلکد. ممکن بود چاقو بگذارند بیخ گلویم و پول‌هایم را بقاپند اما در گوشه و کنارهای آن محله گنگستر معروفی به نام «داچ شولتز» سال‌ها قبل زندگی می‌کرده ،که قبل از به دنیا آمدن من مرده بود اما هنوز طرفداران خودش را داشت. وقتی این کشور قوانین ضد الکل داشت، این آدم نوشیدنی الکلی قاچاق می‌کرد و همچین چیزهایی. وقتی از آن محله رد می‌شدم با خودم می‌گفتم: «پسر! یک روزی داچ شولتز« اینجا زندگی می‌کرده»، اما اینکه آیا مثل بیلی جاه‌طلب بودم؟ باید بگویم که نه.

واقعا مشکل است که آدم بگوید که «بیلی باتگیت» در چه ژانری است، نه گانگستری است به آن معنا و نه شاید مدرن، اما آدم را یاد «هاکلبری فین» می‌اندازد هر چند که ژانر «هاکلبری فین» را ندارد.

حق با شماست. ماجرای هاکلبری فین در سال‌های ۱۸۳۰ می‌گذرد در حالی که در حدودهای ۱۸۷۰ نوشته شده، و آن را رمان تاریخی نمی‌نامید. هاکلبری فین هم برای خودش و نسبت به زمان خودش رمان مدرنی است. اما اگر بیلی باتگیت را هاکلبری فینی مدرن می‌نامید، این لطف شماست. با این وجود باید بگویم که به نظرم پایان هاکلبری فین یک شکست است. یعنی نویسنده کتاب را خوب تمام نکرده.

چرا؟
فکر می‌کنم که «تواین» آخرهای رمان مسیر خودش را گم کرد. این که تام سایر می‌آید و هاکلبری فین به پس زمینه می‌رود یا اینکه تام شوخی‌های بی‌مزه‌ای می‌کند. در واقع تواین یک مدت طولانی‌ای کتاب را گذاشت کنار و نیمه رها کرد و بعد هفت سال بار دیگر رفت سراغش و داستان را آن طوری تمام کرد که می‌دانیم. فکر می‌کنم کل داستان را خراب کرد با این کار. اینکه شخصیت هاکلبری فین را کم کم ناپدید کرد. اما بعضی‌ها این پایان را دوست دارند و تواین را نویسنده‌ی پست‌مدرنی می‌نامند به خاطر همین کارش اما من چنین اعتقادی ندارم.

برادران کوئن هم انگار همین کاری را می‌کنند توی سینما که شما در ادبیات می‌کنید. آن‌ها مثلا فیلم‌های متفاوتی ساخته‌اند از برهه‌های متفاوت تاریخ آمریکا. شما هم همین کار را کردید در ادبیات. نمی‌دانم آن‌ها را می‌شناسید؟ برادران کوئن، دکتروف در عالم سینما هستند؟

تا به حال نشنیده بودم یک نفر همچنین چیزی بگوید. جالب است. یعنی بروم و از آن‌ها شکایت کنم؟ [می‌خندد] برادران کوئن آدم‌های عجبیی هستند، از فیلم «ای برادر، کجایی؟» خوشم آمد. به نظرم فیلم اخیرشان «بی‌باک»، خیلی ساده‌انگارانه بود. اما هیچ وقت ارتباطی بین فیلم‌های آن‌ها و کارهای خودم ندیده‌ام.

از فیلم‌هایی که با اقتباس از کتاب‌هایتان ساخته‌ شده، راضی هستید؟
از همه‌شان بدم می‌آید. همه‌اشان شکست خوردند. در بین آن‌ها، قسمت‌هایی از فیلم «کتاب دانیل» خوب بود. «کتاب دانیل» به نظرم بهترین راهی بود که می‌توانستم داستان رشد رادیکالیسم را در آمریکا توضیح بدهم، همچنین فرق بین راست و چپ. و همچنین چپ قدیم و چپ جدید. فیلمی درباره‌ی این کتابم ساخته شد توسط «سیدنی لومت» که من فیلم‌نامه‌اش را نوشتم. فیلم موفقی نبود اما صحنه‌های قشنگی داشت،‌ می‌شود بهش گفت یک شکست با افتخار. مطمئن نیستم که تقصیر کارگردان بوده یا تقصیر من. شاید تقصیر هر دوی ما. اما آن فیلم تنها فیلمی است که برایش احترام قائلم. سینما دنیای دیگری است. وقتی کتاب می‌خوانم،‌ می‌توانم دنیا را با ذهن آدم دیگری ببینم. از ذهن بیلی یا کس دیگری. اما این کار را نمی‌شود توی سینما کرد چون شما همیشه دارید از بیرون به آدم‌ها نگاه می‌کنید، در حالی که در کتاب دارید دنیا را از دورن می‌بینید. به همین خاطر است که وقتی از دنیای کتاب به دنیای سینما می‌روید، فیلم‌های خوب بر اساس کتاب‌های خوب ساخته نشده، استثنا هم هست، مثلا «دکتر ژیواگو» به نظرم فیلم موفقی است یا فیلم‌هایی که بر اساس «آنا کارنینا» ساخته شده یا فیلم‌های انگلیسی‌ای که بر اساس کتاب‌های «جین آستین» درست شد، خوب هستند، عمدتا کتاب‌های قرن نوزدهم. اما در کل، فیلم‌های خوب فیلم‌هایی هستند که به مدیوم دیگری وابسته نباشند. من یک دفعه با یک کارگردان هم کلام شدم که به من گفت وقتی که صحنه را آماده می‌کند و بر بازیگران لباس می‌پوشاند و موهایشان را درست می‌کند و موسیقی اضافه می‌کند، نود و پنج درصد آن صحنه قبل از آنکه کلمه‌ای از زبانشان بیرون بیاید، به تماشاچی ارائه شده، فیلم‌ها درباره‌ی کلمات نیستند، و فیلم‌هایی که بر اساس رمانی ساخته شده باشند، خیلی پرحرفند. فیلم‌های امروزی معمولا کم‌حرف اند.

آخرین سئوال، توی رویاهایتان چه می‌بینید؟ کابوس‌هایتان چیست؟
طبیعیت خواب‌ها و کابوس‌ها این‌ است که در روز روشن دیگر به‌یادشان نمی‌آورید اما اگر منظور این است که چه چیزی مرا نگران می‌کند، نسل بعدی مرا نگران می‌کند. منظورم از نسل بعد فرزندان من و نوه‌های من است. چه دنیایی به آن‌ها به ارث می‌رسد؟ به چه دنیایی پا می‌گذارند؟ انگار داریم به عقب می‌رویم. مثل اینکه زمان مثل حلقه‌ای است که به دورش می‌چرخیم. یک دور زده‌ایم و حالا داریم بر می‌گردیم به آن زمانی که قرن نوزدهم آن طور بود در این کشور. خشونت به کار رفته و جنون در بعضی جوامع امروزی مثل این است که انگار در قرن سیزدهم زندگی می‌کنیم. انگار که بشر هیچ چیزی بستش نیست. دولت‌هایی داریم که روی مردم خودشان آتش می‌گشایند، در لیبی مثلا. یا در چین. همه جا هست. مگر فقط قرار بود که آدمی را علم کنیم و به او پول و قدرت بدهیم؟ این بود نظریه پشت دولت‌ها؟ بعضی از اتفاقاتی که در جهان امروز رخ می‌دهد، متعلق است به قرن هشتم و سیزدهم اما هنوز این چیزها در حال اجراست. مثلا مسائلی مثل سلاح‌های هسته‌ای یا انکار گرم‌شدن جهان. آدم‌هایی هستند که خودخواهانه گرم شدن زمین را نادیده می‌گیرند و حتی انکارش می‌کنند، به خصوص آدم‌هایی که در صنعت نفت کار می‌کنند. مثلا بعضی کشورها که می‌خواهند بمب اتمی بیشتری بدست بیاورند. ایده‌ی تخریب جهانی، این است که مرا نگران می‌کند. فکر می‌کنم این روزها تخریب جهانی بیشتر رونق داشته باشد چون وحشیگیری بیشتری هست و سلاح‌های پیشرفته‌تری هم به‌کار می‌رود.

ممنون.

می‌شود یک چیزی اضافه کنم درباره‌ی کپی‌رایت؟

حتماً. بفرمایید.

می‌خواهم انتقادی کنم از دولت ایران به خاطر نپیوستن به «کنوانسیون بین‌المللی حق‌ مؤلف». می‌خواهم این را بپرسم از دولت ایران که می‌دانم دولتی مذهبی ست، که قرآن درباره‌ی دزدی چی می‌گوید؟ این را از وزارت فرهنگی می‌پرسم که اجازه‌ی نشر می‌دهد به کتاب‌هایی که بدون اجازه‌ی حق مولف منتشر می‌شوند. می‌شود یک نسخه از ترجمه‌ی کتاب‌هایم به فارسی برایم بفرستید؟ حاضرم پولش را هم بدهم.

+ منبع 


کامنت‌ها

دکتروف: می‌شود نسخه‌ای از ترجمه‌ی کتاب‌هایم به فارسی برایم بفرستید؟

ای.ال.دکتروف (E. L. Doctorow)، نویسنده‌ی شهیر آمریکایی که رمان‌های تاریخی‌اش شهرت فراوانی دارد، دو روز پیش در ۸۴ سالگی درگذشت. دکتروف علاوه بر ۱۰ رمان، دو مجموعه داستان کوتاه و جندین مقاله نیز به چاپ رساند. مشهورترین رمان دکتروف، «رگتایم» است که «نجف دریابندری» آن را به فارسی ترجمه کرد. در ایران، دکتروف را بیشتر با این رمان می‌شناسند. دکتروف معتقد بود "نویسندگی فرم پذیرفته‌شده‌ی شیزوفرنی در جامعه است." او جمله‌ی معروفِ بامزه‌ای هم دارد در باب برخی علائم نگارشی در داستان: "من علامت ویرگول را دوست دارم، اما از نقطه‌ویرگول متنفر ام. فکر می‌کنم آن‌ها به داستان تعلق ندارند. هم‌چنین خیلی وقت است که دیگر از دونقطه برای نقل‌قول استفاده نمی‌کنم. دیگر نیازی به آن‌ها ندارم‌، مثل نقطه‌های سیاه در حال پرواز روی صفحه اند." البته امید دارم اگر کسی خواست از این ادعاها کند، قبلش به درجاتی از دکتروف بودن رسیده باشد! القصه، مرگ او مرا یاد گفت‌وگوی سعید کمالی دهقان است با او در نیویورک انداخت که چهار سال پیش انجام داد. گفت‌وگویی ست بس خواندنی: [ادامــه]


سعید کمالی‌دهقان: به‌واسطه‌ی دوست مشترکی ادگار لورنس دکتروف پذیرفت که بروم دیدنش برای یک گفت‌وگوی حضوری. دوشنبه‌ی نسبتا خنک و بارانی‌ای بود و یک ساعت زودتر رسیده بودم سر قرار. دکتروف که حالا با مرگ سلینجر و جان آپدایک شاید در کنار فیلیپ راث یکی از معدود غول‌های زنده‌ی ادبیات آمریکا باشد، خواست که چند دقیقه‌ای طبقه‌ای پایین منتظر شوم و بعد بروم طبقه‌ی بالا به اتاق کارش که در منطقه‌ی اعیان‌نشینی واقع است در وسط منهتن شهر نیویورک. روی صندلی که نشستم روبروی آقای نویسنده، ناخودآگاه چهره‌ی نجف دریابندی آمد توی ذهنم. مترجمی که «رگتایم» و «بیلی‌باتگیت»، دو شاهکار دکتروف را به فارسی برگردانده. هر دوی‌اشان تاسند، سفید مویند، هم‌سن‌و‌سال‌اند با این تفاوت که دکتروف جوان‌تر است، فقط دو سال. در آن لحظه همه چیز، این دو پیرمرد ادبیات آمریکا و ایران را شبیه هم می‌کرد، عینک‌های گردشان، لباس‌های زرشکی رنگ و مهربانی خارج از وصف هر دو و حتی نحوه‌ی ایستادن‌اشان. پیش از گفت‌وگو، دکتروف از رضا براهنی یاد کرد، از روزهای پیش از انقلاب که براهنی را دستگیر کرده بودند و دکتروف به‌واسطه‌ی یک ناشر آمریکایی برای کتابی از او مقدمه نوشت. شروع که کردیم به گفت‌وگو، به دستگاه ضبط من نگاهی انداخت و ‌گفت: «مطمئنی ضبط می‌کند؟ چراغش خاموش است.» روشن که کردم تا خاموشی بعدی، یک ساعتی و نیمی طول کشید.

نویسنده‌‌ی سبک‌گرایی نیستید. هر یک از کتاب‌هایتان سبک خودش را دارد. یادم می‌آید که جایی گفته بودید همینگوی در سال‌های آخر زندگی، نویسنده‌ی موفقی نبود چون شیفته‌ی سبکش شد.

همینگوی صدای خودش را شنید و این برایش شد مثل یک زندان. من این‌طور فکر می‌کنم. همینگوی مشکلات زیادی داشت، تنها مشکلش آثارش نبود، سال‌های زیادی از جسمش سوءاستفاده کرد،‌ مدام تصادف می‌کرد و کلی زخمی شد. مرتب مسافرت می‌رفت، حتی به آفریقا سفر کرد، بیش از اندازه می‌نوشید و همچنین پدری داشت که خودکشی کرده بود، چیزهایی زیادی بود که باعث شد آن حرف را بزنم، منظورم این نبود که همینگوی فقط به این خاطر خودکشی کرد که به محدودیت‌های شخصی‌اش پی برده بود، محدودیت‌هایی که گریبان خودش را هم گرفت اما محدویت‌های شخصی هم حتما نقشی داشته. اما دوست دارم این طور فکر کنم که هر کتابم سبک خودش را داشته. کتاب‌هایم با یک تصویر یا یک عبارت، یا یک جمله یا حتی یک آوا شروع می‌شود. با چیزی شروع می‌کنم به نوشتن که مرا بکشد به سوی خودش، که تشویقم کند برای ادامه دادن. کتاب‌های من همینطور شروع می‌شود، از نیازی به فکر کردن. هیچ وقت طرحی کلی برای داستان‌هایم ندارم،‌ گاهی گمانه‌هایی می‌زنم که چه کار می‌خواهم بکنم در نهایت اما چون این‌طوری می‌نویسم، صداهای درون کتاب‌هایم با یکدیگر متفاوتند و سبک‌های آن‌ها هم با هم تفاوت دارند. به همین خاطر بعضی از کتاب‌هایم روایت خطی دارند و بعضی‌ها در ساختار کولاژند. خیلی از مواقع از روایت اول شخص استفاده می‌کنم، چون تصورم این است که ابزار بسیار مفیدی است، چون به این شکل راوی بخشی از خود داستان می‌شود. اما تصورم این است که هیچ صدای مشخصی به نام صدای دکتروف وجود ندارد، یا اینکه سبکی وجود ندارد که بشود به آن گفت سبک دکتروف. به همین خاطر نمی‌شود صفحه‌ای را باز کنید و بگویید که حتما این متن نوشته‌ی دکتروف است. نویسنده‌هایی هستند که اگر نوشته‌هایشان را بخوانید، می‌توانید بفهمید که نوشته‌ی کیست، مثل هنری جیمز. اما دلم می‌خواهد که این طوری باشد که هر یک از کتاب‌هایم سبک و لحن خودش را داشته باشد. و خودم نامرئی باشم در کتاب. شاید این‌ها وهم و خیال من باشد و در واقع موفق نشده باشم که این کار را بکنم اما خیلی خوب می‌شود که خودتان را نشناسید در کتاب خودتان. اگر بشناسید، توی همان چاهی می‌افتید که همینگوی درش افتاد، در جایی که همینگوی انعکاس صداهای پیشینش را می‌شنید. شاید این‌ها توهم من باشد اما به عنوان یک نویسنده تلاشم این است که صادق باشم.

پس با توجه به چیزی که شما فکر می‌کنید، به خاطر سبک نویسندگی‌اش بود که موفق نشد یا سبک زندگی‌؟

همینگوی به انبوهی از آشفتگی تبدیل شده بود. شخصیت جنگجویی داشت. یادم می‌آید که از کالج آمده بودم بیرون و داشتم کنار دکه‌ی روزنامه راه می‌رفتم که عناوین خبرها نظرم را جلب کرد: «همینگوی خودکشی کرد.» به نظرم می‌آید که همینگوی در سال‌های پایانی عمرش داشت تلاش می‌کرد که همینگوی نباشد. و کتابی هم منتشر شد بر اساس دستنوشته‌ا‌ی ناتمام و طولانی. همینگوی توی این کتاب تقلا کرده بود که از غرایز همیشگی‌اش فاصله بگیرد و کمی مازوخیست نباشد. اما وقتی این کتاب را بر اساس دستنوشته‌هایش گردآوری کردند، در نهایت هم معلوم بود که کار، کار همینگوی است، تنها کمی کمتر. همینگوی در آغازین سال‌های نویسندگی‌اش برای خودش یک استراتژی معین کرد و طبق آن استراتژی، می‌فهمید که چطور یک داستان را ساختاربندی کند و طبق همان استراتژی، محور اصلی داستانش را خیلی واضح و مبرهن بیان نمی کرد. توی داستان‌های همینگوی، طبق همان استراتژی پیش از نوشتن، موضوع اصلی داستان طوری بود که شخصیت‌های داستان می دانستند ماجرا از چه قرار است اما شما به عنوان خواننده نمی‌دانستید و باید خودتان آن را کشف می‌کردید که به هر حال چیز خیلی هوشمندانه‌ای هم بود. جویس هم یک کم از این کارها کرد، خصوصا توی «دوبلینی‌ها». این طوری است که در یک زمان مشخصی هستید و شخصیت‌ها دارند به طور مشخصی عمل می‌کنند اما به شما به عنوان خواننده توضیح داده نمی‌شود که ماجرا از چه قرار است. جویس گفته بود که قصد دارد به داستان‌هایش یک‌کم حالت وحی و تجلی بدهد، طوری که وقتی خواننده داستان را تمام کرد همه چیز برایش واضح هست اما چون موضوع اصلی درباره‌ش حرف زده نشده و توضیحی داده نشده، در نهایت آن موضوع به شکل قوی‌تری به خواننده منتقل می‌شود. و البته به همراه یک سری صحنه‌های دراماتیزه شده. همینگوی تا جایی پیش رفت که این استراتژی‌ را در کتاب «ناقوس‌ها برای که به صدا در می‌آیند» هم به کار برد، طوری که ساختار کتاب یک کم ضعیف از کار درآمده. استراتژی همینگوی استراتژی‌ای نبود که شما بتوانید همه‌ی عمرتان بهش تکیه کنید. این را هم بگویم که همینگوی در اوجش، نویسنده‌ی بزرگی بود.

وقتی با دوبلینی‌ها مقایسه کردید؛ همین مقایسه را مثلا با کتاب «نه داستان» سلینجر می‌شود کرد؟ سلینجر هم همین ترفند را به کار نبرده؟

خب سلینجر دوست همینگوی بود. با همدیگر تماس داشتند. برایم خیلی جالب است که همینگوی هیچ وقت نتوانست برای همیشه با یک نویسنده دوست بماند. مرد حسودی بود. دوس پاسوس دوستش بود اما سلینجر یک نویسنده‌ی جوانی بود که همینگوی را می‌پرستید و همینگوی هم به همین خاطر به او پاسخ می‌داد، اما بله، بعضی‌ از داستان‌های سلینجر هم همینگونه هست. به شما به عنوان خواننده زیاد توضیح داده نمی‌شود که ماجرا از چه قرار است. که دارد چه اتفاقی می‌افتد. اما فکر نمی‌کنم که سلینجر در همان سطح و سطوح بوده باشد.

فکر می‌کنید که برای همینگوی این استراتژی و سبک تبدیل به یک تله شد؟ به نظر شما همینگوی شیفته‌ی کلمات خودش شد با وجودی که می‌دانیم چقدر به کلمات حساس بود و ساعت‌ها وقت می‌گذاشت برای کلمات مناسب و حتی با وجودی که اعتقاد داشت باید جملاتی که شیفته‌ی آن شده‌اید را دور بیاندازید؟

در زمان خودش همینگوی نویسنده‌‌ای انقلابی بود. اگر با گذشت زمان، ادبیاتش کمرنگ‌تر شود، خودش اما به عنوان یکی از مهم‌ترین چهره‌های تاریخ ادبیات ماندگار خواهد ماند. چون زبان‌بازی‌ها و گزافه‌گویی‌ها را کنار زد و تلاش کرد جملات ساده بنویسد.جملات تمیز. جملات سرراست و تلاش می‌کرد از صفت‌ها و قیدها دوری کند و جمله‌ را به همان شکل ساده به درجه‌ای از قدرت و گیرایی برساند. البته در آخر برای خودش مشکل ایجاد کرد همین قضیه.

و این قضیه باعث شد خیلی‌ها هم از همینگوی الگوبرداری کنند؟
تاثیر زیادی روی خیلی‌ها گذاشت، مثلا روی یک سری نویسنده‌ی داستان‌های اسرارآمیز. داشیل همت و آن کسی که خواب بزرگ را نوشت، اسمش چه بود؟ [ریموند چندلر]. خیلی از نویسنده‌های اسرار آمیز بودند که بدون همینگوی وجود نداشتند.




از همینگوی فاصله بگیریم. کتاب‌های شما درباره‌ی وقایع تاریخی هستند، چه شد به جای اینکه بروید سراغ تاریخ، رفتید سراغ رمان و به جای آنکه مورخی باشید که درباره‌ی تاریخ بنویسد، ترجیح دادید رمان‌نویسی باشید که درباره‌ی تاریخ می‌نویسد؟

من هیچ وقت متوجه نشده بودم که دارم درباره‌ی گذشته می‌نویسم تا اینکه ناشرم بعد از کتاب رگتایم به من گفت که این کتاب درباره‌ی گذشته است، درباره‌ی تاریخ است. من فکر نمی‌کنم که رمان‌ تاریخی می‌نویسم. من هیچ پیشوند و پسوندی را به کلمه‌ی رمان‌نویس نمی‌پذیرم. من یک رمان‌نویس هستم و نه یک رمان‌نویس نیویورکی و نه یک رمان‌نویس تاریخی یا یک رمان‌نویس پست‌مدرن. چرا من تاریخ‌نویس نشدم؟ چون از بچگی دلم می‌خواست که داستان بنویسم و رمان بخوانم. از کتاب‌های کمیک گرفته تا سوپرمن و بت‌من و رمان‌های ورزشی و رمان‌های ماجراجویانه و بعدها هر جور رمانی که جالب به نظر می‌رسید. رمان‌هایی از سروانتش و داستایفسکی و دیکنز. کلی کتاب داشتیم توی خانه‌. همه‌ی کتاب‌های مارک تواین را داشتیم و من هم همه‌ی آن‌ها را خواندم. من همیشه به داستان علاقه‌مند بودم و نه به کتاب‌های تاریخی. موقع خواندن «کونت دو مونت کریستو» یا «جنگ و صلح» به کلی شخصیت‌ تاریخی بر می‌خوردم. آدم‌هایی که می‌شناختم‌اشان. آدم‌های قابل تشخیص تاریخی. مثل ناپلئون. وقتی رگتایم را می‌نوشتم تصور نمی‌کردم که من هم دارم همین‌کار را می‌کنم، البته رگتایم کتاب بدیعی بود در نوع خودش، طوری که مردم ممکن بود تصور کنند که چیز جدیدی است که قبلا همچین چیزی منتشر نشده. اما من یک فرضیه دارم و آن این است که همه‌ی رمان‌ها درباره‌ی گذشته‌اند.

همه رمان‌ها. رمان‌هایی درباره‌ی گذشته‌ی نزدیک و رمان‌هایی درباره‌ی گذشته‌ی دور. چطور تشخیص می‌دهیم که یک رمان تاریخی است؟ وقتی که آدم‌های معروف و شناخته شده توی آن باشد؟ رئیس‌جمهورها و ژنرال‌ها یا هرکس دیگری. یک کتاب نوشتم به نام «نمایشگاه جهانی». برای شخصیت‌های آن کتاب از خانواده‌ی خودم استفاده کردم و حتی از اسم‌هایشان. اما کتابی تاریخی محسوب نمی‌شود. هیچ فرقی نمی‌کند چه از آدم‌هایی استفاده کنید که همه می‌شناسند و چه از آدم‌هایی استفاده کنید که تعداد اندکی می‌شناسند. به این نمی‌گویند کتاب تاریخی. مثلا همین دوست شما ارنست همینگوی، کتاب «ناقوس‌ها برای که به صدا در می‌آیند» را زمانی نوشت که جنگ داخلی اسپانیا هنوز تمام نشده بود. مثل آندره مالرو که کتاب «امید» را وقتی نوشت که هنوز جنگ تمام نشده بود. بعضی از این کتا‌ب‌ها زمانی نوشته شد که جنگ هنوز تمام نشده بود اما نویسنده‌هایشان این‌ طور وانمود کردند که تمام شده. وقتی به آن کتاب‌ها اشاره می‌شود، کتاب تاریخی هستند؟ در آن‌ کتاب‌ها، از آدم‌هایی نام برده شده که هنوز مشغول جنگیدن بودند. وقتی که کتاب می‌نویسید، می‌توانید به هر زمانی سفر کنید و با هیچ مرزی روبرو نباشید. هیچ مرز جغرافیایی یا روحی یا زمانی نیست که شما را محدود کند. زمان معنایی ندارد. زمان تنها یک وسیله است برای روایت یک داستان. ویلیام فاکنر یک قلمروی خیالی داشت به نام «یوکناپاتافا» و آن قلمرو به یک چارچوب تبدیل شد برای کارهایش. چیزی که من در «کتاب دانیل» و بعدها در «رگتایم» کشف کردم این بود که می‌شود رمان نوشت و ساختارش را بر زمان بنا کرد و نه بر مکان. ویلیام فاکنر یک قلمرو در می‌سی‌سی‌پی دارد و من اولین دهه‌ی قرن بیست را داشتم و آن دهه چهارچوب رمان من شد.

دلیل دوم که من مورخ نیستم این است که اصلا اهل تحقیق کردن نیستم. من محقق خوبی نیستم. از من می‌پرسند که برای نوشتن کتاب‌هایت چقدر تحقیق می‌کنی و من می‌گویم به قدر کافی. نویسنده‌های زیادی را می‌شناسم که آن‌قدر تحقیق می‌کنند که نمی‌توانند در نهایت درباره‌اش بنویسند چون زیاده از حد می‌دانند. اگر در حالی که می‌نویسید بخواهید نگاه هم بکنید که نمی‌شود. اگر دنبال چیزی باشید به نحوی پیدایش می‌کنید، به شکل مخصوص خودش. البته در کتاب «رژه» من یک کم بیشتر از کتاب‌های دیگرم تحقیق کردم. من داشتم تحقیق می‌کردم بدون اینکه خودم بدانم دارم تحقیق می‌کنم. داشتم خاطرات «ژنرال شرمن» و ژنرال‌های دیگری را می‌خواندم و اصلا به فکرم هم نمی‌رسید که بعدها بخواهم درباره‌اشان کتابی بنویسم. وقتی شروع به نوشتن کتاب کردم دیدم که چیزهایی در مغزم هست که آن‌ها را می‌دانم. واقعیت این است که تاریخ‌نگاری اصلا مرا خوشنود نمی‌کند.

درباره‌ی نوشتن «رگتایم» یک‌جایی گفته‌اید که به عکسی از «جی پی مرگان» نگاه کردید و شروع کردید به نوشتن. اینکه منبع شما درباره‌ی مرگان همان عکس بوده. نمی‌ترسیدید از اینکه حق مطلب را ادا نکنید؟

وقتی از شخصیتی استفاده می‌کنید که کار مهمی در زندگی کرده، مثلا یک آدم شناخته شده، دارید همان کاری را می‌کنید که نقاش می‌کند در کشیدن یک پرتره، وقتی نقاشی پرتره‌ی شما را می‌کشد، آن پرتره با خود شما فرق می‌کند، قضاوت و دید نقاش است از شما که روی بوم آمده. یک طور واکنش به حضور شما در آن نقاشی است و آن پرتره، شما نیستید. در واقع دو چیز هست، یکی شما و دیگری آن پرتره. این همان کاری است که نویسنده می‌کند، یک شخصیت تاریخی را تاویل می‌کند و فکر می‌کنم که کار اشتباهی نباشد. آدم‌های مشهور برای تخیل ما مفید هستند. آدم‌های مشهور اغلب موارد سعی می‌کنند یک داستان خیالی از خودشان به جهان ارائه کنند، یعنی آن چیزی که خودشان از خودشان ارائه می‌کنند اصولا یک‌کم خیالی است، این‌ها همه پیش از آن است که یک نویسنده برود سراغ‌شان. بگذارید یک چیز خنده‌دار بگویم، اگر می‌خواهید بهترین رمان را درباره‌ی «جی پی مرگان» بخوانید، بروید زندگی‌نامه‌ی رسمی مرگان را بخوانید. اینجا رسم است که سیاست‌مداران پس از اتمام خدمت یک کتاب می‌نویسند تا بگوید که مثلا فلان‌طور بوده‌اند، از شما می‌خواهند تا پرتره‌ای که خودشان از خودشان ارائه می‌دهند را بپذیرید، و اصولا آن چیزی که ارائه می‌دهند، خیلی خیالی است. مثلا «هنری کسینجر» کتاب‌های زیادی نوشته و ادعا می‌کند که جانب بی‌طرفی را رعایت کرده درباره‌ی دست‌آوردهای به ‌اصطلاح مهم‌اش.

کتاب «رژه» در جنگ داخلی آمریکا می‌گذرد، «رگتایم» در دهه‌ی نخست قرن بیستم اتفاق می‌افتد. به‌نطر می‌رسد که از شخصیت‌ها یا همان‌طور که گفتید از بازه‌های زمانی استفاده می‌کنید برای پوشش دادن بخشی از تاریخ آمریکا. وقتی کتاب «هومر و لنگلی» را نوشتید، می‌خواستید کتابی بنویسید درباره‌ی هومر و لنگلی چون شیفته‌ی شخصیت‌شان شده بودید یا تصمیم داشتید از داستان آن دو برادر استفاده کنید برای توصیف نیویورک در دهه‌ی چهل و پنجاه قرن گذشته‌؟ کدامیک مقدم بوده، داستان هومر و لنگلی یا آن برهه‌ی تاریخی؟

مقدم‌ترین چیز در کتاب من نخستین جمله‌ی کتاب است. «من هومر هستم، برادر کوره» و وقتی این را می‌نوشتم اصلا تصور نمی‌کردم که چنین کتابی بشود، یعنی کتابی درباره‌ی هومر و لنگلی. عاشق آن جمله بودم. شروع خوبی بود، آن جمله مرا مجبور می‌کرد که ادامه دهم. درباره‌ی هومر و لنگلی می‌دانستم از قبل. اسطوره‌های نیویورک بودند برای سالیان سال و روزنامه‌ها نقش داشتند در اسطوره کردن آن‌ها. برادرانی که عاشق جمع کردن آت و آشغال بودند و هیچ کس آن موقع از نظر انسان‌شناسی برای رفتار این دو نامی نداشت. مثل اختلال رفتاری یا نوعی از وسواس. آن‌ها به افسانه‌های نیویورک تبدیل شده بودند. من به گوشه‌گیری آن‌ها علاقه‌مند نبودم و یا به آن جنبه از شخصیت‌اشان که علاقه داشت به گردآوری اشیاء، من به این علاقه داشتم که چطور شد که این‌ها این طور شدند؟ هومر و لنگلی از خانواده‌ی ثروتمندی آمده بودند، پدر پزشکی داشتند و مادر قابل احترامی و خیلی هم با جامعه‌ی شهر نیویورک ارتباط داشتند و خانه‌ی خوبی در محله‌ی خوبی داشتند اما وقتی پدر و مادرشان رفتند، این دو برادر درهای خانه را به روی همه بستند و تا جایی که می‌توانستند خودشان را جدا کردند از جامعه‌ی بیرون و من در کتابم آن‌ها را به متصدیان یا موزه‌داران زمان و ذهن خودشان تبدیل کردم. به آدم‌هایی که مثل موزه‌داران در حال جمع‌آوری تکه‌های متفاوت زمان و ذهن زندگی خودند. خانه‌اشان مثل موزه شده بود.

و البته هومر و لنگلی کتاب شما با هومر و لنگلی واقعی فرق‌هایی هم می‌کند، مثلا سن‌هایشان را تغییر دادید. چه شد که این کار را کردید. مثلا یک‌دفعه تصمیم گرفتید که خب من سن‌های این دو را تغییر بدهم؟

من اصلا قصد نداشتم که زندگی این دو را مستند کنم. یا اینکه بیماری این‌ها را مستند کنم. من به این دو به عنوان افسانه علاقه داشتم. وقتی سراغ اسطوره‌ها می‌روید، زندگی آن‌ها را تفسیر می‌کنید برای خودتان. من هم آن دو را تفسیر کردم به روش خودم. خانه‌ی اصلی آن‌ها مثلا در منطقه‌ی شمالی‌تری در نیویورک واقع بود و من جایش را تغییر دادم و آوردم کمی پایین‌تر. باید به یاد داشته باشید که وقتی دارید درباره‌ی چیزی می‌نویسید که در گذشته اتفاق افتاده، در اصل درباره‌ی گذشته‌ی خودتان هم دارید می‌نویسید. چرا من رفتم و درباره‌ی هومر و لنگلی نوشتم؟ منتقدی می‌گفت که رمان «هومر و لنگلی» درباره‌ی آنتروپی [اصطلاحی در فیزیک به معنای افت و رکود] است. این که انرژی در حال کاهش و کم شدن است. یکی گفت به شکلی نشان‌دهنده‌ی زندگی امروز آمریکا است. این‌ها تفسیر بقیه‌ی آدم‌هاست. آدم‌ها این‌طوری می‌گویند، یا واکنش نشان می‌دهند، چون طبیعتا هر آدمی در گذشته مشکلات خودش را داشته به عنوان یک انسان. مثلا مشکلات شخصی. یا مشکلات اقتصادی و رکود اقتصادی. فقط داستان‌نویس‌ها نیستند که درباره‌ی گذشته حرف می‌زنند، سیاست‌مدارن هم سراغ گذشته می‌روند.

«هومر و لنگلی» یک طور واکنش به سیاست‌های «جورج بوش» هم بود؟ یک جور به سخره گرفتن همه‌ی چیزهایی نبود که توی این سال‌ها برای آدم‌ها ارزشمند شده؟

شما همیشه در حال واکنش به زمان خودتان هستید و این واقعیت دارد. مردم تاریخ را می‌نویسند تا نیازهای امروز جامعه برطرف شود یا مشخص و معین شود. «رژه» را بعد از آن نوشتم که «جورج بوش» ما را برد به جنگ. تنها کتابی بود که آن موقع می‌توانستم بنویسم.

تاریخ همیشه درباره‌ی حقیقت است و رمان‌ها درباره‌ی ماجراهای خیالی یا دروغین. بعضی‌ها می‌گویند رمان‌نویس‌ها دروغ‌گوهای خوبی هستند.

وقتی رمانی را بر می‌دارید بخوانید، مطمئنید که خیالی است اما وقتی یک سیاست‌مدار حرف می‌زند، ادعا می‌کند که خیالی حرف نمی‌زند. سیاست‌مداران هم مثل نویسنده‌ها به خوبی می‌دانند که به راحتی می‌شود واقعیت‌ها را تغییر داد. می‌شود آن‌ها را تغییر دارد یا شکل‌شان را عوض کرد، به هر شکل ممکنی. هر دو این قضیه را به خوبی می‌دانند و به همین خاطر است که سیاست‌مدارها همیشه با داستان‌نویس‌ها مشکل دارند. هنری جیمز می‌گوید رمان‌نویس خودش را با نوشتن داستان سرگرم می‌کند، تا حقیقت نادیده را ببیند. برای دیدن حقیقت نادیده شاید مجبور شوید که بعضی چیزهای را عوض کنید یا تغییر دهید اما حقیقت خودش آنجاست و تغییر نمی‌کند. حقیقت را نمی‌شود تنها بواسطه مجموعه‌ای از واقعیت‌ها دید، این نظر رمان‌نویس است. اینکه حقیقت‌های بزرگتری وجود دارد. با نوشتن جملاتی که واقعیت ندارد، از حقیقت محروم نمی‌شوید. هنری جیمز در هنر رمان‌نویسی به همین قضیه اشاره می‌کند که رمان‌نویس درک و هوشی دارد که می‌تواند از ناکجاآباد مطلب بگیرد و آن را روی کاغذ بیاورد. موهبت جمله‌ای که بر اساس واقعیت‌ها نباشد، این است که می‌تواند در دامنه‌ی تخیلات سیر کند تا حقیقت بزرگتری را بیابد. مثلا تولستوی در ناپلئون چیزهایی می‌دید که مورخان آن‌ها را ندیدند. مثلا ناپلئون را در حالتی توصیف کرد که با ژنرالی حرف می‌زد و شانه‌هایش از خشم می‌لرزید، کدام مورخ حاضر است همچین چیزی بنویسد؟ و اینکه نمی‌توانست به خوبی اسب دوانی کند و اینکه شخصیت خودپسندی داشت. نویسنده چیزهایی را در داستان‌اش اضافه می‌کند و از چیزهایی چشم پوشی می‌کند و این طور است که در نهایت حقیقت نمایان می‌شود.

جان آپدایک جایی گفته بود که شما با این سبک نوشتن وقایع تاریخی را به یک جور بازی تبدیل کردید در نوشتن کتاب‌هایتان. این طور نوشتن و این‌طور رفتار کردن با شخصیت‌ها و وقایع تاریخی، بازی است برای شما؟

نه بازی نیست. من آپدایک را دوست داشتم، اما من و آپدایک خیلی باهم تفاوت داشتیم. آپدایک خیلی فلسفی می‌نوشت و خیلی محافظه‌کار بود به عنوان یک نویسنده. اما قبول ندارم که این‌ها برای من بازی است. آپدایک منظورش احتمالا این بوده که من با شخصیت‌های کتابم خیلی حال می‌کردم. برای آپدایک کتاب من یک‌کم دست چپی بود، آپدایک یک‌کم دست راستی بود نسبت به من. در آمریکا وقتی درباره‌ی طبقه‌ی کارگر حرف می‌زنید شما را دست چپی حساب می‌کنند، در تاریخ این کشور کتاب‌های خیلی کمی هست که درباره‌ی طبقه‌ی کارگر نوشته شده باشد. کتاب‌های خوب کمی داریم درباره‌ی موضوع کسب و کار. در آمریکا، بیشتر رمان‌های خوب درباره‌ی طبقه‌ی متوسط جامعه است. در این کشور رمان سیاسی زیاد محبوب نبوده. منتقدهایمان هم زیاد اهل رمان سیاسی نیستند. وقتی یک رمان سیاسی در کشور دیگری نوشته می‌شود، منتقدهای ما به انتشار آن واکنش نشان می‌دهند و نقدش می‌کنند. مثلا استقبال می‌کنند از کتاب‌هایی که نویسندگان سفیدپوست آفریقای جنوبی نوشته‌اند درباره‌ی آپارتاید. اما همین آدم‌هایی که رمان‌ سیاسی کشورهای دیگر را دوست دارند، رمان‌ سیاسی آمریکایی را نمی‌پسندند یا دوست ندارند اینجا رمان سیاسی نوشته شود.

درباره‌ی آن تصویری حرف زدیم که با دیدنش شروع کردید به نوشتن درباره‌ی شخصیت «جی پی مرگان» در کتاب رگتایم. فکر نمی‌کنید رگتایم آلبوم عکسی باشد از شخصیت‌های تاریخی آن دوره‌ی آمریکا؟

همچین توصیفی درباره‌ی کتابم نشنیده بودم تا به حال. اما توصیف جالبی است. آن طوری که من آن کتاب را نوشتم خیلی خود به خود بود. یعنی خودش خودش را به وجود آورد. مثلا شخصیت سیاهپوست کتاب یا همان «کلهاس واکر»، من در خلق کردن آن از یک نویسنده‌ی آلمانی الهام گرفتم، نویسنده‌ای به نام «هاینریش فون کلایست»، که اوایل قرن نوزده میلادی می‌نوشت،‌ و رمان کوتاه زیبایی نوشت به نام «میشائیل کلهاس» [نشر ماهی؛ ترجمه: محمود حدادی]، کلهاست یک دلال اسب است و اسب‌ها را می‌برد برای فروش اما به او می‌گویند که باید عوارض بدهد و او هم که زیر بار عوارض نمی‌رفته، می‌رود برای پرس و جو و در این بین اسب‌هایش مورد آزار و اذیت قرار می‌گیرند و بعد به دنبال حق‌طلبی می‌رود و در نهایت به شخصیتی انقلابی‌ تبدیل پیدا می‌کند. این آدم الهامی شد برای شخصیت «کلهاس واکر» رمان رگتایم. از من می‌پرسند که فلان و بهمان چیز واقعا برای کلهاس، موسیقیدان سیاه‌پوست، اتفاق افتاده و من می‌گویم که یادم نمی‌آید که اتفاق افتاده باشد اما سال‌ها بعد از نوشتن رگتایم یک عکسی را دیدم از یک آدم سیاه‌پوستی در کنار ماشینش که غارت شده بود [همان تصویری که دکتروف در رگتایم آورده]. منظورم همچنین چیزی است وقتی می‌گویم نویسنده در داستان خیالی به نحوی حقیقت را در می‌یابد. آلبوم عکس؟ نمی‌دانم، آدم‌ها می‌گویند که کتاب‌های من خیلی تصویری و سینمایی هستند و تا به حال هم چندین فیلم بر اساس کتاب‌هایم ساخته شده و کارگردان‌ها به من گفته‌اند که چقدر سخت‌ا‌شان بوده که رمانم را فیلم کنند. تا به حال نشینده بودم که یکی بگوید آلبوم عکس. توصیف خوبی است.

چقدر بیلی کتاب «بیلی باتگیت» به خود شما و خصوصا آرمان‌ها و آرزوهایتان در جوانی شباهت دارد؟

وقتی جوان بودم خیابان‌های زیادی را پشت سر می‌گذاشتم تا به یک کتاب‌خانه‌ی عمومی برسم و در این مسیر از منطقه‌ی «برانکس شرقی» رد می‌شدم، که محله‌ی خشنی بود و زیاد هم برای جوانی به سن و سال من مناسب نبود که آنجا تنهایی بپلکد. ممکن بود چاقو بگذارند بیخ گلویم و پول‌هایم را بقاپند اما در گوشه و کنارهای آن محله گنگستر معروفی به نام «داچ شولتز» سال‌ها قبل زندگی می‌کرده ،که قبل از به دنیا آمدن من مرده بود اما هنوز طرفداران خودش را داشت. وقتی این کشور قوانین ضد الکل داشت، این آدم نوشیدنی الکلی قاچاق می‌کرد و همچین چیزهایی. وقتی از آن محله رد می‌شدم با خودم می‌گفتم: «پسر! یک روزی داچ شولتز« اینجا زندگی می‌کرده»، اما اینکه آیا مثل بیلی جاه‌طلب بودم؟ باید بگویم که نه.

واقعا مشکل است که آدم بگوید که «بیلی باتگیت» در چه ژانری است، نه گانگستری است به آن معنا و نه شاید مدرن، اما آدم را یاد «هاکلبری فین» می‌اندازد هر چند که ژانر «هاکلبری فین» را ندارد.

حق با شماست. ماجرای هاکلبری فین در سال‌های ۱۸۳۰ می‌گذرد در حالی که در حدودهای ۱۸۷۰ نوشته شده، و آن را رمان تاریخی نمی‌نامید. هاکلبری فین هم برای خودش و نسبت به زمان خودش رمان مدرنی است. اما اگر بیلی باتگیت را هاکلبری فینی مدرن می‌نامید، این لطف شماست. با این وجود باید بگویم که به نظرم پایان هاکلبری فین یک شکست است. یعنی نویسنده کتاب را خوب تمام نکرده.

چرا؟
فکر می‌کنم که «تواین» آخرهای رمان مسیر خودش را گم کرد. این که تام سایر می‌آید و هاکلبری فین به پس زمینه می‌رود یا اینکه تام شوخی‌های بی‌مزه‌ای می‌کند. در واقع تواین یک مدت طولانی‌ای کتاب را گذاشت کنار و نیمه رها کرد و بعد هفت سال بار دیگر رفت سراغش و داستان را آن طوری تمام کرد که می‌دانیم. فکر می‌کنم کل داستان را خراب کرد با این کار. اینکه شخصیت هاکلبری فین را کم کم ناپدید کرد. اما بعضی‌ها این پایان را دوست دارند و تواین را نویسنده‌ی پست‌مدرنی می‌نامند به خاطر همین کارش اما من چنین اعتقادی ندارم.

برادران کوئن هم انگار همین کاری را می‌کنند توی سینما که شما در ادبیات می‌کنید. آن‌ها مثلا فیلم‌های متفاوتی ساخته‌اند از برهه‌های متفاوت تاریخ آمریکا. شما هم همین کار را کردید در ادبیات. نمی‌دانم آن‌ها را می‌شناسید؟ برادران کوئن، دکتروف در عالم سینما هستند؟

تا به حال نشنیده بودم یک نفر همچنین چیزی بگوید. جالب است. یعنی بروم و از آن‌ها شکایت کنم؟ [می‌خندد] برادران کوئن آدم‌های عجبیی هستند، از فیلم «ای برادر، کجایی؟» خوشم آمد. به نظرم فیلم اخیرشان «بی‌باک»، خیلی ساده‌انگارانه بود. اما هیچ وقت ارتباطی بین فیلم‌های آن‌ها و کارهای خودم ندیده‌ام.

از فیلم‌هایی که با اقتباس از کتاب‌هایتان ساخته‌ شده، راضی هستید؟
از همه‌شان بدم می‌آید. همه‌اشان شکست خوردند. در بین آن‌ها، قسمت‌هایی از فیلم «کتاب دانیل» خوب بود. «کتاب دانیل» به نظرم بهترین راهی بود که می‌توانستم داستان رشد رادیکالیسم را در آمریکا توضیح بدهم، همچنین فرق بین راست و چپ. و همچنین چپ قدیم و چپ جدید. فیلمی درباره‌ی این کتابم ساخته شد توسط «سیدنی لومت» که من فیلم‌نامه‌اش را نوشتم. فیلم موفقی نبود اما صحنه‌های قشنگی داشت،‌ می‌شود بهش گفت یک شکست با افتخار. مطمئن نیستم که تقصیر کارگردان بوده یا تقصیر من. شاید تقصیر هر دوی ما. اما آن فیلم تنها فیلمی است که برایش احترام قائلم. سینما دنیای دیگری است. وقتی کتاب می‌خوانم،‌ می‌توانم دنیا را با ذهن آدم دیگری ببینم. از ذهن بیلی یا کس دیگری. اما این کار را نمی‌شود توی سینما کرد چون شما همیشه دارید از بیرون به آدم‌ها نگاه می‌کنید، در حالی که در کتاب دارید دنیا را از دورن می‌بینید. به همین خاطر است که وقتی از دنیای کتاب به دنیای سینما می‌روید، فیلم‌های خوب بر اساس کتاب‌های خوب ساخته نشده، استثنا هم هست، مثلا «دکتر ژیواگو» به نظرم فیلم موفقی است یا فیلم‌هایی که بر اساس «آنا کارنینا» ساخته شده یا فیلم‌های انگلیسی‌ای که بر اساس کتاب‌های «جین آستین» درست شد، خوب هستند، عمدتا کتاب‌های قرن نوزدهم. اما در کل، فیلم‌های خوب فیلم‌هایی هستند که به مدیوم دیگری وابسته نباشند. من یک دفعه با یک کارگردان هم کلام شدم که به من گفت وقتی که صحنه را آماده می‌کند و بر بازیگران لباس می‌پوشاند و موهایشان را درست می‌کند و موسیقی اضافه می‌کند، نود و پنج درصد آن صحنه قبل از آنکه کلمه‌ای از زبانشان بیرون بیاید، به تماشاچی ارائه شده، فیلم‌ها درباره‌ی کلمات نیستند، و فیلم‌هایی که بر اساس رمانی ساخته شده باشند، خیلی پرحرفند. فیلم‌های امروزی معمولا کم‌حرف اند.

آخرین سئوال، توی رویاهایتان چه می‌بینید؟ کابوس‌هایتان چیست؟
طبیعیت خواب‌ها و کابوس‌ها این‌ است که در روز روشن دیگر به‌یادشان نمی‌آورید اما اگر منظور این است که چه چیزی مرا نگران می‌کند، نسل بعدی مرا نگران می‌کند. منظورم از نسل بعد فرزندان من و نوه‌های من است. چه دنیایی به آن‌ها به ارث می‌رسد؟ به چه دنیایی پا می‌گذارند؟ انگار داریم به عقب می‌رویم. مثل اینکه زمان مثل حلقه‌ای است که به دورش می‌چرخیم. یک دور زده‌ایم و حالا داریم بر می‌گردیم به آن زمانی که قرن نوزدهم آن طور بود در این کشور. خشونت به کار رفته و جنون در بعضی جوامع امروزی مثل این است که انگار در قرن سیزدهم زندگی می‌کنیم. انگار که بشر هیچ چیزی بستش نیست. دولت‌هایی داریم که روی مردم خودشان آتش می‌گشایند، در لیبی مثلا. یا در چین. همه جا هست. مگر فقط قرار بود که آدمی را علم کنیم و به او پول و قدرت بدهیم؟ این بود نظریه پشت دولت‌ها؟ بعضی از اتفاقاتی که در جهان امروز رخ می‌دهد، متعلق است به قرن هشتم و سیزدهم اما هنوز این چیزها در حال اجراست. مثلا مسائلی مثل سلاح‌های هسته‌ای یا انکار گرم‌شدن جهان. آدم‌هایی هستند که خودخواهانه گرم شدن زمین را نادیده می‌گیرند و حتی انکارش می‌کنند، به خصوص آدم‌هایی که در صنعت نفت کار می‌کنند. مثلا بعضی کشورها که می‌خواهند بمب اتمی بیشتری بدست بیاورند. ایده‌ی تخریب جهانی، این است که مرا نگران می‌کند. فکر می‌کنم این روزها تخریب جهانی بیشتر رونق داشته باشد چون وحشیگیری بیشتری هست و سلاح‌های پیشرفته‌تری هم به‌کار می‌رود.

ممنون.

می‌شود یک چیزی اضافه کنم درباره‌ی کپی‌رایت؟

حتماً. بفرمایید.

می‌خواهم انتقادی کنم از دولت ایران به خاطر نپیوستن به «کنوانسیون بین‌المللی حق‌ مؤلف». می‌خواهم این را بپرسم از دولت ایران که می‌دانم دولتی مذهبی ست، که قرآن درباره‌ی دزدی چی می‌گوید؟ این را از وزارت فرهنگی می‌پرسم که اجازه‌ی نشر می‌دهد به کتاب‌هایی که بدون اجازه‌ی حق مولف منتشر می‌شوند. می‌شود یک نسخه از ترجمه‌ی کتاب‌هایم به فارسی برایم بفرستید؟ حاضرم پولش را هم بدهم.

+ منبع 


کامنت‌ها

دلبسته

خیلی از آدمها هستند که به اشیا دل می بندند.

منم شاید جز این دسته از آدمها باشم.

همسرم قبل از اینکه به خواستگاری ام بیاید یک حلقه ساده طلایی برایم خرید .

هم اولین هدیه اش به من بود و هم نوعی درخواست به ازدواج بود...

بعد از آمدن دخترک حلقه کاملا برآیم تنگ شده بود.

اما به عنوان نماد عشقمان نگهش داشته بودم.

خودم رو پیرزن و دخترک رو زن جوانی تصور می کردم ...

و خودم رو می دیدم که در حین دادن حلقه به دخترک داستان خریدنش رو هم تعریف می کنم...

اما این سکانس از زندگی من دیگر اجرا نخواهد شد.

امروز حلقه را فروختم....

حلقه نمادین عشقمان را به همراه انگشتر نشان نامزدی و چندتا یادگار دیگر فروختم....

زنجیر وان یکاد دخترک و نیم ست طرح لوئیس ویتون که هدیه مادرشدنم بود ...

همه را فروختم...

کمی دلم لرزید...کمی غمگین شدم...

اما وقتی به حلقه طلای یادگار مادرم نگاه می کنم با خودم می گویم کاش مادرم این حلقه اش را

می فروخت اما خودش بود...

من یادگاری های همسر و دخترکم را فروختم اما دراین سکوت شب صدا نفسهای هردویشان را

می شنوم.

من شاید دلبسته اشیا باشم اما کسانی که آن اشیا را برآیم عزیز کرده اند ،بیشتر دوست می دارم.

 

 

دلبسته

خیلی از آدمها هستند که به اشیا دل می بندند.

منم شاید جز این دسته از آدمها باشم.

همسرم قبل از اینکه به خواستگاری ام بیاید یک حلقه ساده طلایی برایم خرید .

هم اولین هدیه اش به من بود و هم نوعی درخواست به ازدواج بود...

بعد از آمدن دخترک حلقه کاملا برآیم تنگ شده بود.

اما به عنوان نماد عشقمان نگهش داشته بودم.

خودم رو پیرزن و دخترک رو زن جوانی تصور می کردم ...

و خودم رو می دیدم که در حین دادن حلقه به دخترک داستان خریدنش رو هم تعریف می کنم...

اما این سکانس از زندگی من دیگر اجرا نخواهد شد.

امروز حلقه را فروختم....

حلقه نمادین عشقمان را به همراه انگشتر نشان نامزدی و چندتا یادگار دیگر فروختم....

زنجیر وان یکاد دخترک و نیم ست طرح لوئیس ویتون که هدیه مادرشدنم بود ...

همه را فروختم...

کمی دلم لرزید...کمی غمگین شدم...

اما وقتی به حلقه طلای یادگار مادرم نگاه می کنم با خودم می گویم کاش مادرم این حلقه اش را

می فروخت اما خودش بود...

من یادگاری های همسر و دخترکم را فروختم اما دراین سکوت شب صدا نفسهای هردویشان را

می شنوم.

من شاید دلبسته اشیا باشم اما کسانی که آن اشیا را برآیم عزیز کرده اند ،بیشتر دوست می دارم.

 

 

از سکوت‌ها

خوبم. اول دستم در آتل بود، بعد قلبم و حالا کم‌کم بانداژ رسیده به زبانم. خوبم اما. این روزه‌ی سکوت که تمام شود، خوب‌تر هم می‌شوم. یک‌وقت‌هایی سکوت مرهم است.

از سکوت‌ها

خوبم. اول دستم در آتل بود، بعد قلبم و حالا کم‌کم بانداژ رسیده به زبانم. خوبم اما. این روزه‌ی سکوت که تمام شود، خوب‌تر هم می‌شوم. یک‌وقت‌هایی سکوت مرهم است.